変数にアクセスするとき、Ruby のフォールバック メカニズムは最初にローカル変数を検索し、見つからない場合は自動的に適用self
してインスタンス変数を検索します。ただし、次のコードは機能しません。
class My
def init
@abc = "abc"
end
def pt
puts abc
end
end
pt
インスタンスを呼び出そうとすると、次のエラー メッセージが表示されました。
2.0.0-p247 :009 > my = My.new
=> #<My:0x007f9b5a1b1000>
2.0.0-p247 :010 > my.init
=> "abc"
2.0.0-p247 :011 > my.pt
NameError: undefined local variable or method `abc' for #<My:0x007f9b5a1b1000 @abc="abc">
ただし、@abc
DOES はオブジェクトのインスタンス変数として存在します。
2.0.0-p247 :012 > my.instance_variables
=> [:@abc]
では、なぜここでpt
見つからないのでしょうか。abc
ローカルで定義されていないため、インスタンス変数を自動的に検索して出力するべきではありませんか?
ノート:
を使用するとうまくいくことはわかってputs @abc
いますが、これは私の質問のポイントではありません。私の質問は、Ruby のフォールバック メカニズムについてです。このコードは機能します:
2.0.0-p247 :079 > class My
2.0.0-p247 :080?> def initialize(param)
2.0.0-p247 :081?> @abc = param
2.0.0-p247 :082?> end
2.0.0-p247 :083?>
2.0.0-p247 :084 > def printabc
2.0.0-p247 :085?> puts abc
2.0.0-p247 :086?> end
2.0.0-p247 :087?> end
2.0.0-p247 :089 > My.new("haha").printabc
haha
前のケースでは機能しないのに、後者では機能する理由がわかりません。