2017-07-15 101 views
0

如果我運行下面的Ruby代碼:紅寶石消息自

class Foo 

    def foo=(something) 
    puts "It's a #{something}" 
    end 

    def foo_assign 
    self.foo = "bar" 
    end 
end 

f = Foo.new 
f.foo_assign 

輸出是:It's a bar

在另一方面,如果我運行代碼:

class Foo 

    def foo=(something) 
    puts "It's a #{something}" 
    end 

    def foo_assign 
    foo = "bar" 
    end 
end 

f = Foo.new 
f.foo_assign 

沒有輸出。 fooself.foo是如何給出的?

+0

'foo ='是一個局部變量賦值。 – Ilya

+0

@Ilya這是否意味着我需要一個明確的接收器來指定賦值方法? – ljnissen

回答

1

foo = "bar"foo_assign方法中是不明確的。 Ruby認爲你試圖分配一個局部變量而不是調用該方法,所以這就是它爲你做的。 (假設在下一行設置bar = "foo",即使沒有bar=方法,它仍然可以工作)。如果您試圖執行或調用的內容不明確,則必須使用self.。比我更好的人可能會更好或更清楚地解釋這一點,但這就是發生在這裏的事情。

+0

很好解釋。謝謝! – ljnissen