4

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

class Test
  def val=(val)
    @val = val
    return 99
  end
end

t = Test.new
result = (t.val = 2)
result # => 2

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

4

2 回答 2

2

分配始终评估为分配的值。这是一个简单而一致的规则,既Ruby 内部保持一致,也与大多数其他基于表达式的编程语言一致。

其他一切都将是一个不一致的特殊情况,这些都是不好的。

于 2013-04-09T00:55:25.823 回答
2

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

@user_id = user.id = next_user_id

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

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

  def modified?
    @modified
  end
end

这段代码完全可以正常工作,直到有一天你把它放到像上面这样的分配链中,突然之间你会得到意想不到的结果。

因此,解释器做了某种巫术并确保赋值的 RHS 是返回值,丢弃实际的返回值。

于 2013-04-09T02:17:19.137 回答