2013-04-09 94 views
4

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

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

@user_id = user.id = next_user_id 

但是当你没有考虑这个问题时会发生什么,所以返回值与输入值不一样?

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

    def modified? 
    @modified 
    end 
end 

此代码将工作完全正常,直到有一天,当你去放弃它在分配链就像上面,当突然间,你会得到意想不到的效果。

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

2

作业总是评估为指定值。这是一个简单而一致的规则,在之内一致的,以及与大多数其他基于表达式的编程语言一致。

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

+2

如果使用'Kernel#send'来调用setter,它将返回实际值。 – 2013-04-09 02:18:18

相关问题