ローカル変数とメソッド呼び出し

いきなりですが、コードを

class Test
  attr_accessor :str
  
  def set(str)
    @str = str
  end
  
  def get
    str
  end
end

test = Test.new
test.set("test")

puts test.get

これ、結果は「test」が出力されます。

Ruby慣れしてない僕にはこのコードの意味が分からず、かなり悩んでしまいました…。


getで返してるのはローカル変数のstrですよね…、なんでnilじゃなくて「test」ががが
という感じだったわけです。


getメソッドで返してるのは、ローカル変数「str」に見えるわけですが

また未定義の(つまりコード中に書かれていない)ローカル変数を参照すると、 Ruby は次にそれを self への(引数のない)メソッド呼び出しに解釈しようとします。メソッドの探索にも失敗したら例外 NameError を発生します。

プログラミング言語 Ruby リファレンスマニュアル

これにより、メソッド「str」を呼び出します。


ここで、「attr_accessor :str」を宣言しているので
インスタンス変数「str」(@str)に対してのアクセサが作られ、
結果、@strが返ってくる、というわけです。


ん…今になって気づいたけど、
ActiveRecordを継承したクラス内で、「price」とか書いてフィールド参照してるのも
メソッドを呼び出してるわけか!全然気にせず書いていた…。


c#でメソッド名の頭文字を大文字にするありがたみがわかったような気がします…。