为什么赋值的值始终是参数的值?

有人会解释为什么在旧版本的Ruby中,赋值的结果是属性设置方法返回的值,但在Ruby 1.8之后,赋值的值始终是参数的值; 方法的返回值被丢弃。 在下面的代码中,旧版本的Ruby会将结果设置为99.现在结果将设置为2。

class Test def val=(val) @val = val return 99 end end t = Test.new result = (t.val = 2) result # => 2 

这种变化背后的原因是什么?

当您想要将相同的值分配给多个变量时,将赋值链接在一起并不罕见。 这在其他语言中更为常见。

 @user_id = user.id = next_user_id 

但是当你没有考虑到这一点时会发生什么,因此返回值与输入值不同?

 class User def id=(name) @id = name @modified = true end def modified? @modified end end 

这段代码完全没问题,直到有一天你把它放在如上所述的赋值链中,突然间你会得到意想不到的结果。

因此,解释器执行某种伏都教并确保赋值的RHS是返回值,丢弃实际返回值。

分配始终评估为指定的值。 这是一个简单而一致的规则, Ruby本身中都是一致的,并且与大多数其他基于表达式的编程语言一致。

其他一切都是不一致的特殊情况,那些都很糟糕。