有人会解释为什么在旧版本的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
这种变化背后的原因是什么?
答案 0 :(得分:2)
分配始终评估为指定的值。这是一个简单而一致的规则,在 Ruby本身中一致,并且与大多数其他基于表达式的编程语言一致。
其他一切都是不一致的特殊情况,而且那些都不好。
答案 1 :(得分:2)
当您想要将相同的值分配给多个变量时,将分配链接在一起的情况并不少见。这在其他语言中更为常见。
@user_id = user.id = next_user_id
但是当您没有考虑这种情况时会发生什么,因此返回值与输入值不同?
class User
def id=(name)
@id = name
@modified = true
end
def modified?
@modified
end
end
这段代码完全没问题,直到有一天你把它放到如上所述的任务链中,突然间你会得到意想不到的结果。
因此,解释器执行某种伏都教并确保赋值的RHS是返回值,丢弃实际的返回值。