2016-05-24 12 views
0

なぜ、 '属性='内部の初期化にselfという接頭辞が必要なのか分かりません。initialize()ルビの明示的な内部が必要な理由

'名前' 方法は

attributes = attrs に変更self.attributes = attrs場合{=> "誰か" "名前"}方法

class A 
attr_accessor :attributes 

    def initialize attrs ={} 
    self.attributes = attrs 
    end 

    def name 
    puts attributes 
    end 
end 

a = {"name" => "someone"} 
b = A.new a 

b.name 

出力を '属性' と呼ぶために接頭辞自己を持っている必要はありません。出力がゼロになる

+0

これはすべて、あなたの 'initialize'メソッドの本体でRubyが' attributes = 'とどのように見えるかによって異なります。それをメソッド呼び出しに強制する 'self'なしでは、それはしばしば変数の代入として解釈されます。 – tadman

+0

「しばしば」ではありません。 *常に* 'foo = bar'は常に' foo'というローカル変数に代入します。実際には、それはRubyがローカル変数参照とメソッド呼び出しを区別する方法です。 'foo'は代入' foo = bar'が以前に解析された場合にのみローカル変数参照です。 –

答えて

1

attributes = attrsを使用する場合は、ローカル変数attributesattrsと同じようにattrsを割り当てます〜some_other_varattributesself.で前に付けることにより、アクセサを使用する必要があることを指定します。

+0

私はattr_accessorによって定義された属性= def nameが属性の終了を説明する方法を考えました。 – helloyi621

+0

get 'attributes'アクセサを呼び出すと、' attributes'という名前の変数がローカルにある場合は最初にルックアップが実行され、 'attributes'という名前のインスタンスメソッドが見つからない場合は、定義したとおりに検索されますそれは 'attr_accessor'と一緒です。 'attributes ='での代入の場合、ローカル変数の代入とインスタンス設定メソッドを区別する方法がありません。なぜなら、 'self.attributes ='でそれを明確にする必要があるからです – maartenvanvliet

関連する問題