我对Ruby中的赋值方法感到很困惑。在文档中,它说:
以等号结尾的方法表示赋值方法。 对于赋值方法,将忽略返回值和参数 而是返回。
我知道这可以用作Class中的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?
为什么带有等号的方法在Class和类外部运行不同?
答案 0 :(得分:4)
a = 123
原则上,这里存在歧义。它是一个setter调用还是一个局部变量赋值? Ruby通过选择局部变量赋值来解决这个问题。如果你想要这个方法,那就明确一点。
self.a = 123
在另一种情况下,没有歧义。
答案 1 :(得分: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方法。