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
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
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では、インスタンス変数はクラスの中で使う変数であり、クラスの外からアクセスできません。しかし、attr_accessorクラスを使うことで、書き換えたり、参照することが可能です。
なお、同じ処理は、その変数にアクセスするメソッドを作成することで、実現できます。しかし、それよりも、attr_accessorを活用すれば、簡潔で読み易いプログラムが書けます。同様に、読み込み専用や書き込み専用のメソッドもあるので、目的に応じて使い分けてください。
また、Rubyについてもっと詳しく学びたい方は、ポテパンキャンプの利用を検討されてはいかがでしょうか。
Rubyを学びたい方におすすめのスクールはこちら