ローカル変数とメソッド呼び出し
いきなりですが、コードを
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#でメソッド名の頭文字を大文字にするありがたみがわかったような気がします…。