对Ruby中的赋值方法感到困惑(使用等号定义的方法)

时间:2017-02-15 09:37:31

标签: ruby

我对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和类外部运行不同?

2 个答案:

答案 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方法。