Как я могу переопределить метод Fixnum + (плюс) в Ruby и сохранить оригинальный + функционал? - PullRequest
7 голосов
/ 17 марта 2012

При этом возникает ошибка SystemStackError в 1.9.2 Ruby (, но работает в Rubinius ):

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

, но super для + нет (на основанииошибки).

Как получить доступ к исходной функциональности +?

Ответы [ 2 ]

14 голосов
/ 17 марта 2012

Используйте alias_method. Псевдоним Fixnum + к чему-то другому, затем обратитесь к нему в новом +:

class Fixnum
  alias_method :old_add, :+
  def +(other)
    self.old_add(other) * 2
  end
end
1 голос
/ 30 апреля 2012

Другим интересным подходом было бы передать блок методу 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.

...