Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

Rubyのattr_accessorは、クラス内でしか参照できないインスタンス変数をクラスの外から直接操作できるようにする機能です。

クラスの外からインスタンス変数にアクセスするには、メソッドを用意するのが一般的です。しかしクラスの外から直接参照したいケースもあります。その場合は、attr_accessorを利用してください。今回は、インスタンス変数の基本と、attr_accessorの使い方について解説します。

この記事の結論
  • Rubyではインスタンス変数はクラスの外からアクセスできない
  • インスタンス変数はクラスの外からアクセスするならattr_accessorを使う
  • 使い方はattr_accessorに続いて変数名に「:」を付けて指定する
  • attr_accessorと同様の機能としてattr_readerとattr_writerもある

attr_accessorはインスタンス変数を扱うメソッド

Rubyでは、クラスの中でならインスタンス変数を利用できますが、これをクラスの外から直接操作できません。操作するためには、特別な設定が必要です。

そして、それを簡単に設定できるのが今回紹介するattr_accessorメソッドです。attr_accessorの機能を紹介する前に、インスタンス変数について説明します。

インスタンス変数の定義

インスタンス変数とは、クラスをnewメソッドで作成したインスタンス毎に、クラスの中に作られる変数です。クラス内に宣言されたメソッドの中ならどこでも使えますが、クラスの外からは基本的にアクセスできません。

なお、インスタンス変数は、変数名に「@」を付けて、他の変数と区別されます。

インスタンス変数

@変数名

インスタンス変数の定義例

def initialize()
  @name = 'potepan'
end

この例では、クラスが作成された際、インスタンス変数の@nameに、「potepan」を代入します。

インスタンス変数を外部から操作するには

同じクラスから複数のインスタンスを作成した場合、外部からインスタンス変数の値を指定するケースはよくあります。しかし、先ほど説明したように、基本的に外部からインスタンス変数を書き換えることはできません。

例えば、次のような使い方はできません。

インスタンス変数の間違った代入方法

p1 = Potepan.new
p1.@name = 'potepan'

インスタンス変数を外部から書き換えるには、そのためのメソッドを用意しなければなりません。

インスタンス変数を外部から書き換えるメソッドの例

class Potepan
  def name=(val)
    @name = val
  end
end

p1 = Potepan.new
p1.name = 'potepan'

Potepanクラスに、インスタンス変数@nameを書き換えるためのメソッドnameを用意したので、このメソッドを使ってインスタンス変数が書き換えられます。

attr_accessorメソッドの機能

今回紹介するattr_accessorは、クラスの外からインスタンス変数を書き換えられるようにするメソッドです。つまり、先ほど紹介したインスタンス変数を外部から書き換えるメソッドを、簡単に書けるようにしたメソッドと言えるでしょう。
Rubyを学びたい方におすすめのスクールはこちら

attr_accessorメソッドの基本

次から、attr_accessorメソッドの文法と基本的な使い方について紹介します。

attr_accessorメソッドの書式

先ほど説明したように、attr_accessorは、クラスの外からインスタンス変数を書き換えられるようにするメソッドですが、下記のように変数の前に「:」を付けて指定します。

attr_accessor :変数名

簡単な使用例

attr_accessor  :name

上の例は、titleというインスタンス変数を、クラスの外からも書き換え可能にします。

attr_accessorメソッドと同じ定義の書き方

Rubyのリファレンスマニュアルには、attr_accessorは、下記のメソッドの定義と同じと書かれています。

「attr_accessor :name」と同じメソッドの定義

def name
  @name
end
def name=(val)
  @name = val
end

この2つのメソッドのうち、上の方はクラスの外からインスタンス変数を参照するためのメソッドです。また、下の方は、書き換えするためのメソッドです。

このようにattr_accessorは、設定したインスタンス変数を、クラスの外から参照可能にし、さらに、書き換えも可能にしてくれます。このように、attr_accessorは、上記の2つのメソッドの定義を、1行で簡潔に書けるメソッドです。

attr_accessorメソッドで複数の変数を定義できる

attr_accessorメソッドでは、複数のインスタンス変数に対して、クラスの外から書き換えられるようにすることが可能です。そして、複数のインスタンス変数を指定する場合は、「,」で区切り、それぞれの変数に「:」を付けます。

複数のインスタンス変数を定義する例

attr_accessor  :name, :title, :placed

Rubyを学びたい方におすすめのスクールはこちら

attr_accessorメソッドの使用例

次から、attr_accessorメソッドを使用したRubyのスクリプトの書き方を、例で紹介しながら解説します。

インスタンス時に引数として指定する

Rubyでは、クラスをnewメソッドでインスタンスした際に、引数を渡すことが可能です。そして、その場合、引数をクラスの中で利用するためには、クラスの外からインスタンス変数に値を書き込まなければなりません。そして、この処理で使われるのがattr_accessorメソッドです。

クラスをインスタンスした際に引数を渡すRubyの書き方を、次の例で説明します。

class Member
  attr_accessor :name

  def initialize name
    @name = name
  end

  def view
    puts @name
  end
end

member = Member.new "Potepan"
member.view

上記の例は、Memberというクラスをインスタンスし、引数で指定した文字列をインスタンス変数nameに代入し、クラス内のviewメソッドで表示します。そして、attr_accessorメソッドでインスタンス変数nameを、クラスの外から読み書きできるようにしたので、引数を引き渡すことが可能です。

インスタンス変数を直接アクセスする

先ほど、newメソッドの引数で変数を指定する方法を説明しましたが、attr_accessorで宣言することで、変数を直接修正することも可能です。そのため、クラスの外から変数を指定して代入することで、その値をクラスの中で利用できます。また、クラスの外で、クラスの中のインスタンス変数にアクセスが可能です。

member = Member.new "Potepan"
puts member.name
member.name = "Style"
puts member.name

上の例の実行結果は次のとおりで、newメソッドで設定した文字列から、変数に直接代入した文字列に変更することも可能です。

Potepan
Style

Rubyを学びたい方におすすめのスクールはこちら

attr_accessorと同様のメソッド

attr_accessorを設定したインスタンス変数は、クラスの外から読み込みと書き込みの両方が可能です。Rubyにはattr_accessorと同様のメソッドとして、読み込み専用のメソッドと、書き込み専用のメソッドがあるので、次からこの2つを説明します。

読み込み専用のメソッド:attr_reader

attr_readerは、インスタンス変数を、クラスの外から読み込みだけを可能にするメソッドです。そして、使いカは、attr_accessorと同じで、変数に「:」を付けて指定します。

attr_reader :変数名

簡単な使用例

attr_reader :name

書き込み専用のメソッド:attr_writer

attr_writerは、インスタンス変数を、クラスの外から書き込みだけを可能にするメソッドです。こちらも使いカがattr_accessorと同じで、変数に「:」を付けて指定します。

attr_writer :変数名

簡単な使用例

attr_writer :name

Rubyを学びたい方におすすめのスクールはこちら

まとめ

Rubyでは、インスタンス変数はクラスの中で使う変数であり、クラスの外からアクセスできません。しかし、attr_accessorクラスを使うことで、書き換えたり、参照することが可能です。

なお、同じ処理は、その変数にアクセスするメソッドを作成することで、実現できます。しかし、それよりも、attr_accessorを活用すれば、簡潔で読み易いプログラムが書けます。同様に、読み込み専用や書き込み専用のメソッドもあるので、目的に応じて使い分けてください。

また、Rubyについてもっと詳しく学びたい方は、ポテパンキャンプの利用を検討されてはいかがでしょうか。
Rubyを学びたい方におすすめのスクールはこちら

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。