为什么赋值的值总是参数的值?

时间:2013-04-09 00:36:28

标签: ruby

有人会解释为什么在旧版本的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

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

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是返回值,丢弃实际的返回值。