9

これにより、1.9.2 Ruby で SystemStackError がスローされます (ただし、Rubinius では機能します)。

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

しかし、 (他のエラーに基づいて) superforはありません。+

+元の機能にアクセスするにはどうすればよいですか?

4

2 に答える 2

16

を使用しalias_methodます。Aliasを別Fixnum+ものに変更してから、 new で参照します+

class Fixnum
  alias_method :old_add, :+
  def +(other)
    self.old_add(other) * 2
  end
end
于 2012-03-16T22:34:15.327 に答える
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 2との時間はより簡単です2/2

于 2012-04-30T18:22:15.560 に答える