如何在Ruby中重新定义Fixnum的+(plus)方法并保留原始+功能?

时间:2012-03-16 22:07:58

标签: ruby super rubinius yarv

这会在1.9.2 Ruby中引发SystemStackError(但在Rubinius中工作):

class Fixnum
  def +(other)
   self + other * 2
  end
end

super没有+(基于其他错误)。

如何访问原始+功能?

2 个答案:

答案 0 :(得分:14)

使用alias_method。别名Fixnum' s +或其他内容,然后在新+中引用它:

class Fixnum
  alias_method :old_add, :+
  def +(other)
    self.old_add(other) * 2
  end
end

答案 1 :(得分:1)

另一种有趣的方法是将块传递给Fixnum的module_eval方法。所以,例如:

module FixnumExtend
  puts '..loading FixnumExtend module'

  Fixnum.module_eval do |m|
    alias_method :plus,     :+
    alias_method :min,      :-
    alias_method :div,      :/
    alias_method :mult,     :*
    alias_method :modu,     :%
    alias_method :pow,      :**

    def sqrt
     Math.sqrt(self)
    end

  end

end

现在,在我的应用程序中包含FixnumExtend后,我可以这样做:

2.plus 2   
=> 4

81.sqrt
=> 9

我正在使用这种方法来帮助我的OCR引擎识别手写代码。使用2.div 22/2更容易。