ruby,define [] =运算符,为什么不能控制返回值?

时间:2011-06-16 03:37:37

标签: ruby

尝试做一些可能会变得更有用的奇怪的东西,我试图在自定义类上定义我自己的[]=运算符,你可以做,并让它返回与{{1}不同的东西}参数,显然你做不到。 value运算符的返回值始终为[]=;即使重写此运算符,也无法控制返回值。

value

有没有人对此有解释?有什么方法吗?

ruby​​ MRI 1.8.7。所有红宝石都是一样的;它是语言的一部分吗?

2 个答案:

答案 0 :(得分:9)

请注意,此行为也适用于所有赋值表达式(即属性赋值方法:def a=(value); 42; end)。

我的猜测是它以这种方式设计,可以很容易地准确理解用作其他表达式一部分的赋值表达式。

例如,期望x = y.a = z[4] = 2为:

是合理的
  1. 致电z.[]=(4,2),然后
  2. 致电y.a=(2),然后
  3. 2分配给本地变量x,最后分配
  4. 将值2输出到任何“周围”(或更低优先级)表达式。
  5. 这是principle of least surprise;相反,如果它最终等同于x = y.a=(z.[]=(4,2))(最终值受到两个方法调用的影响),那将是相当令人惊讶的。


    虽然不完全具有权威性,但 Programming Ruby 必须说:

    • Programming Ruby(1.8),在Expressions部分:

        

      赋值语句在其左侧(左值)设置变量或属性以引用右侧的值(右值)。然后它返回该值作为赋值表达式的结果。

    • 第22.6节表达式,条件和循环中的
    • Programming Ruby 1.9 (3rd ed)

      (在描述[]=方法调用之后)

        

      赋值表达式的值是它的右值。即使赋值是返回不同内容的属性方法,也是如此。

答案 1 :(得分:5)

这是一个赋值语句,它们总是评估为赋值。让这种不同会很奇怪。

我想您可以使用x.[]= :a, "a"来捕获返回值。