Вызов super из метода модуля

Я пытаюсь переопределить метод, расположенный в Gem в Ruby/Rails, и борюсь с некоторыми проблемами.

Моя цель — выполнять пользовательский код при вызове метода из Gem, а также продолжать выполнять исходный код.

Я попытался абстрагировать код в следующий скрипт:

module Foo
  class << self
    def foobar
      puts "foo"
    end
  end
end

module Foo
  class << self
    def foobar
      puts "bar"
      super
    end
  end
end


Foo.foobar

Выполнение этого скрипта дает мне эту ошибку:

in `foobar': super: no superclass method `foobar' for Foo:Module (NoMethodError)

Как мне написать метод переопределения, чтобы я мог вызывать super с этим исключением?

PS: переопределение работает нормально, если я удалю супер, но тогда исходный метод не вызывается, и я этого не хочу.


person Elhu    schedule 19.09.2011    source источник


Ответы (2)


Вызов super ищет следующий метод в цепочке поиска методов. Ошибка говорит вам, что именно вы здесь делаете: в цепочке поиска методов для Foo есть метод foobar, так как он ни от чего не наследуется. Код, который вы показываете в своем примере, является просто переопределением модуля Foo, поэтому наличие первого Foo ничего не делает.

person jergason    schedule 19.09.2011
comment
^это, вы просто переопределяете метод foobar - person derp; 19.09.2011
comment
Хорошо, сейчас я понимаю. Большое спасибо! - person Elhu; 20.09.2011

Вы можете делать то, что хотите, вот так:

module Foo
  class << self
    alias_method :original_foobar, :foobar
    def foobar
      puts "bar"
      original_foobar
    end
  end
end
person Tim Scott    schedule 21.05.2012
comment
Вы, сэр, герой. Спасибо. - person zachaysan; 20.09.2016