2017-02-15 4 views
0

Rubyでの割り当て方法について本当に混乱しています。ドキュメントでは、Rubyでの割り当て方法がわかりません(等号で定義されたメソッド)

等号で終わるメソッドは、割り当て方法を示しています。 代入メソッドの場合、戻り値は無視され、代わりに という引数が返されます。

これは、クラスのセッターメソッドとして使用できます。しかし、私はまだそのコンセプトについて混乱しているように感じます。以下のコードでは、

class Foo 
    # setter method 
    def foo=(x) 
    puts "OK: x=#{x}" 
    end 
end 
f = Foo.new 
f.foo = 123 # OK: x=123 

def a=(value) 
    puts "value is #{value}" 
end 
a = 123  # why there is no output? 
p a   # 123, why this only return the argument? 
p a = 123 # 123, why this only return the argument? 

等号のあるメソッドがクラス内とクラス外で異なる方法で実行されるのはなぜですか?原則として

答えて

4

= 123

、あいまいさがここにあります。それはセッター呼び出しかローカル変数割り当てですか? Rubyは、ローカル変数割り当てを選択することでこれを解決します。メソッドが必要な場合は明示してください。

self.a = 123 

その他の場合、あいまいさはありません。

4

a = 123のようなものを見ると、インタプリタはこれが常に割り当て操作であるとみなします。ただし、self.a = 123に電話することができます。これは適切な割り当てではないため(変数名にはドットを含めることはできません)。定義したメソッドが呼び出されます。それは別の動作ではありませんので、同じことが、クラスの内部で起こること

注:

class Foo 
    def foo=(x) 
    puts "OK: x=#{x}" 
    end 

    def bar 
    foo = 1 
    end 

    def baz 
    self.foo = 1 
    end 
end 

barを呼び出すと、あなたのメッセージを印刷しない、それだけで割り当てを実行します。 bazはあなたのセッターメソッドを実行します。

関連する問題