代码之家  ›  专栏  ›  技术社区  ›  Peter

Ruby中是否存在正确的加法/乘法?

  •  5
  • Peter  · 技术社区  · 16 年前

    我见过如何超载 + * 红宝石,所以 my_obj + other 电话 my_obj.+(other). 在python中,使用 __add__ 有一个对应的 __radd__ 超载 other + my_obj . Ruby中是否真的没有等价的右侧加法/乘法,这是否需要重新定义 + 对于每种潜在的 other ?

    简而言之:假设我有一个物体 X 它属于我定义的新类。编写代码很容易 X + 5 但为了处理 5 + X 我需要重新定义 Fixnum.+ .这是真的吗?

    3 回复  |  直到 16 年前
        1
  •  6
  •   sepp2k    16 年前

    不,您不需要重新定义fixnum(或Ruby数值类的任何其他算术方法)。数值类的算术方法将调用 coerce 如果两个操作数不是同一类。所以如果你为你的类定义了一个强制方法, 5 + instance_of_your_class 在不更改FixNum+的情况下工作正常。

    编辑:以下是使用强制的示例:

    class MyNum
      attr_accessor :num
    
      def initialize(num)
        @num = num
      end
    
      def +(o)
        lhs, rhs = coerce(o)
        MyNum.new(lhs.num + rhs.num)
      end
    
      def coerce(o)
        if o.is_a? MyNum
          [self, o]
        else
          [self, MyNum.new(o)]
        end
      end
    end
    
    MyNum.new(5)+3 #=> #<MyNum:0x87fca08 @num=8>
    3+MyNum.new(5) #=> #<MyNum:0x8807980 @num=8>
    
        2
  •  0
  •   Paul Keeble    16 年前

    rhs是强制的,需要实现to-i方法,该方法需要返回适当的值。numeric的类实现to_int将最终作为添加过程的一部分调用它,在rhs上涉及的其他类比严格的numeric后代要多。

        3
  •  -1
  •   August Lilleaas    16 年前

    对。如果你想改变 5 + x ,无论5是什么,你都必须重新定义+因为你实际上是在打电话 5.+(x) 因为Ruby将这些操作视为Mechod调用。

    推荐文章