以下代码:
class A
def foo= foo; puts "b" end
end
A.new.foo=("foo").tap{puts "a"}
导致在"a"
之前打印"b"
,这意味着在设置方法tap
之前调用foo=
。这对我来说是违反直觉的,因为我认为方法链是从左到右工作的。在此示例中,看起来跳过setter方法并稍后执行。然而,很明显,setter方法并不总是在代码中最后执行。然后,这个foo=
或者setter方法一般在什么时间执行?
答案 0 :(得分:4)
你遇到的问题是你并没有真正调用foo=
方法,而是执行赋值。 Ruby将其解释为:
A.new.foo = ("foo").tap{puts "a"}
因此,它首先执行点击' foo'然后执行赋值。
要看到一切正常,请尝试:
A.new.send(:foo=, 'foo').tap {puts 'a'}