尝试做一些可能会变得更有用的奇怪的东西,我试图在自定义类上定义我自己的[]=
运算符,你可以做,并让它返回与{{1}不同的东西}参数,显然你做不到。 value
运算符的返回值始终为[]=
;即使重写此运算符,也无法控制返回值。
value
有没有人对此有解释?有什么方法吗?
ruby MRI 1.8.7。所有红宝石都是一样的;它是语言的一部分吗?
答案 0 :(得分:9)
请注意,此行为也适用于所有赋值表达式(即属性赋值方法:def a=(value); 42; end
)。
我的猜测是它以这种方式设计,可以很容易地准确理解用作其他表达式一部分的赋值表达式。
例如,期望x = y.a = z[4] = 2
为:
z.[]=(4,2)
,然后y.a=(2)
,然后2
分配给本地变量x
,最后分配2
输出到任何“周围”(或更低优先级)表达式。这是principle of least surprise;相反,如果它最终等同于x = y.a=(z.[]=(4,2))
(最终值受到两个方法调用的影响),那将是相当令人惊讶的。
虽然不完全具有权威性,但 Programming Ruby 必须说:
Programming Ruby(1.8),在Expressions部分:
赋值语句在其左侧(左值)设置变量或属性以引用右侧的值(右值)。然后它返回该值作为赋值表达式的结果。
Programming Ruby 1.9 (3rd ed):
(在描述[]=
方法调用之后)
赋值表达式的值是它的右值。即使赋值是返回不同内容的属性方法,也是如此。
答案 1 :(得分:5)
这是一个赋值语句,它们总是评估为赋值。让这种不同会很奇怪。
我想您可以使用x.[]= :a, "a"
来捕获返回值。