2017-07-15 76 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