执行setter方法的时间

时间:2014-05-12 10:45:44

标签: ruby setter

以下代码:

class A
  def foo= foo; puts "b" end
end
A.new.foo=("foo").tap{puts "a"}

导致在"a"之前打印"b",这意味着在设置方法tap之前调用foo=。这对我来说是违反直觉的,因为我认为方法链是从左到右工作的。在此示例中,看起来跳过setter方法并稍后执行。然而,很明显,setter方法并不总是在代码中最后执行。然后,这个foo=或者setter方法一般在什么时间执行?

1 个答案:

答案 0 :(得分:4)

你遇到的问题是你并没有真正调用foo=方法,而是执行赋值。 Ruby将其解释为:

A.new.foo = ("foo").tap{puts "a"}

因此,它首先执行点击' foo'然后执行赋值。

要看到一切正常,请尝试:

A.new.send(:foo=, 'foo').tap {puts 'a'}