为什么irb在赋值方法的情况下回显赋值的右侧而不是返回值?

似乎令人惊讶的是,在所有其他情况下,irb将回显方法的返回值。 为什么通过setter的赋值表现不同?

我正在使用Ruby 2.2.2。

irb(main):001:0> def x=(value); puts "puts_from_x"; "returned_string_from_x"; end => nil irb(main):002:0> self.x = 3 puts_from_x => 3 

更新

我突然意识到它与rhs相呼应,因为那是实际的回报值 。 为什么是这样?

在此主题中关注@Matz回复:

Setter总是返回它们最初分配的值它是一个设计选择。 我们将赋值的值定义为右手表达式的值,而不是赋值方法的返回值。

没有找到具体的答案为什么, 但这个页面作为讨论它 。

特别:

如果你定义一个«assignment-like»方法(在末尾有一个等号),Ruby会在你调用它时执行该方法,但是总是返回提供的参数,而不是方法的结果。

想想这样的事情,许多人习惯于从C等其他语言中看到:

 foo.x = foo.y = 3 

你假设foo.xfoo.y都被设置为3 ,并且由于这个Ruby“function”,你是对的。

编辑:Arup的post有一个很好的链接,为什么…