2017-02-15 93 views
0

我真搞不清楚在Ruby中的分配方法。在文檔中,它說:困惑在Ruby中的分配方法(定義法等號)

以等號結尾的方法表示分配方法。 對於分配方法,返回值被忽略,並且參數 的,而不是返回。

我知道這可能是用作類setter方法。不過,我仍然對這個概念感到困惑。在下面的代碼中:

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

原則上,此模糊性。它是一個setter調用還是一個局部變量賦值? 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將執行你的setter方法。