Вызов переопределенного метода в супермодуле в Ruby - PullRequest
0 голосов
/ 07 января 2020

В следующем коде Parent#just_do переопределяет GrandParent#just_do. В классе Me как мне позвонить GrandParent#just_do?

module GrandParent
  def just_do
    puts "GrandParent"
  end
end

module Parent
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    include GrandParent

    def just_do
      puts "Parent"
    end
  end
end

class Me
  include Parent

  def self.just_do
    super # this calls Parent#just_do
  end
end

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Вы можете напрямую работать с объектом метода .

class Me
  include Parent

  def self.just_do
    method(:just_do).super_method.super_method.call
  end
end
2 голосов
/ 07 января 2020

Вы не можете действительно отменить что-то. В этом конкретном случае вы можете повторно импортировать его, но это может иметь и другие побочные эффекты.

Вероятно, для «Родителя» лучше сохранить оригинал, потому что может потребоваться его вызов:

module GrandParent
  def just_do
    puts "GrandParent"
  end
end

module Parent
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    include GrandParent

    # Creates an alias to the original method
    alias_method :grandpa_just_do, :just_do
    def just_do
      puts "Parent"
    end
  end
end

class Me
  include Parent

  def self.just_do
    # Call using the alias created previously
    grandpa_just_do
  end
end

Me.just_do
...