Принудительный вызов Kernel :: method_name для вызова в Ruby - PullRequest
2 голосов
/ 25 мая 2010

Я хочу добавить метод foo в модуль ядра Ruby, чтобы я мог написать foo(obj) в любом месте и заставить его что-то сделать для obj. Иногда я хочу, чтобы класс переопределил foo, поэтому я делаю это:

module Kernel
  private  # important; this is what Ruby does for commands like 'puts', etc.
  def foo x
    if x.respond_to? :foo
      x.foo  # use overwritten method.
    else
      # do something to x.
    end
  end
end

это хорошо и работает. но что, если я хочу использовать значение по умолчанию Kernel::foo в каком-либо другом объекте, который перезаписывает foo? Поскольку у меня есть метод экземпляра foo, я потерял исходную привязку к Kernel::foo.

class Bar
  def foo  # override behaviour of Kernel::foo for Bar objects.
    foo(3) # calls Bar::foo, not the desired call of Kernel::foo.
    Kernel::foo(3)  # can't call Kernel::foo because it's private.
    # question: how do I call Kernel::foo on 3?
  end
end

Есть ли какой-нибудь чистый способ обойти это? Я бы предпочел, чтобы у меня не было двух разных имен, и я определенно не хочу делать Kernel::foo публичным.

Ответы [ 3 ]

3 голосов
/ 25 мая 2010

Более общее решение, чем просто super (супер не всегда работает), также смотрите в этой теме:

Как получить доступ к скрытой глобальной функции в Ruby?

3 голосов
/ 25 мая 2010

Вы можете использовать ключевое слово super для вызова реализации суперкласса из переопределенного метода.

class Bar
  def foo  # override behaviour of Kernel::foo for Bar objects.
    super
    # do something else here
  end
end
0 голосов
/ 25 мая 2010

Просто используйте alias или alias_method до , и вы переопределяете Kernel.foo, чтобы сохранить ссылку на исходную версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...