【Rails】クラス内インスタンス変数の宣言attr_accessorとは何か

2018年2月28日

Rubyの学習を進めていく中でかなり難しい部分に遭遇したので、質問で聞いたこと、調べたことで自分の理解をまとめておく。

クラスの中のインスタンス変数は@aiueoとなっていて、変数の頭に@が付くようだ。これは暗記しておけばよいだろうか。今までの変数はaiueoとか、fruitとかでよかったのに、クラスの中の変数には@をつけなくてはいけないということかね?(・・?)

という混乱の中から始まりました(笑)

クラス内の変数は

attr_accessor :aiueo, :hoge, :sage

とやってシンボルを渡して宣言することになっている。これを「インスタンス変数」と呼ぶ。

attr_accessorでシンボルを渡して宣言すると、そのシンボル名のインスタンス変数を中で生成している。
その時の変数は@aiueo, @hoge, @sageとなる。結果的にシンボル名の先頭に@が付いた変数が生成されている。

ややこしいな。。

でも

self.@aiueo = “あいうえお”
self.@hoge = 256
self.@sage = ‘リンゴ’

じゃなくて

self.aiueo = “あいうえお”
self.hoge = 256
self.sage = ‘リンゴ’

とかで代入できたりする。余計ややこしいわ!(#^ω^)

ますます混乱してきた。多分このページにアクセスしてきてくれた人もこんな感じで混乱してるんじゃないだろうか。

で、リファレンスはここを確認。
https://ref.xaio.jp/ruby/classes/module/attr_accessor

attr_accessorというのは実はメソッドで、中で何をやってるかを見ていけば理解ができました。

クラス内でインスタンス変数aiueoを宣言します。

attr_accessor :aiueo

とやるとattr_accessorにaiueoシンボルを渡します。

そうすると以下のように中で、aiueoというメソッドを生成しつつ、@aiueoという変数を生成します。

  def aiueo
    @aiueo
  end

  def aiueo=(hoge)
    @aiueo = hoge
  end

元のクラス内でself.aiueo とかやったりしますけど

puts self.aiueo
で変数aiueoの中を取り出して見せたり

self.aiueo = “かきくけこ”
みたいに代入ができるんですが

実は

self.aiueo = “かきくけこ”
というのは、

def aiueo=(hoge)で定義されてるように、@aiueoに”かきくけこ”を代入している訳で。

puts self.aiueo
というのは def aiueo で定義された@aiueoをリターンしていて、それを表示している訳です。

途中で出てきたメソッド名=という表現

メソッドの宣言のときにメソッド名の末尾にイコールを書いてメソッドを宣言できます。他のプログラミング言語には無い表現の仕方ですね。

def aiueo=(hoge)

これは通常のメソッドと違い、代入が出来るメソッドとして振る舞う事ができます。

obj.aiueo = “りんご”

みたいな事ができるわけですね。

なんでこんなややこしい事してるんだろう‥Rubyは簡単なプログラミング言語です!(嘘)