Получить дочернюю константу в родительском методе - Ruby - PullRequest
23 голосов
/ 30 марта 2012

Можно ли в Ruby получить константу потомка, когда я вызвал метод родителя через потомка?

Пример:

class Tester
  class Parent

    def go
      EWOCK
    end
  end

  class Child < Parent
    EWOCK = "EWOCKS rule"

  end
end

Затем вызвать Tester::Child.new.goи хотите, чтобы "правило EWOCKS" вернулось?

[Редактировать 3/31]

Ух, я ДЕЙСТВИТЕЛЬНО извиняюсь, ребята.Я полностью облажался с объяснением.

  • Родитель должен был быть ребенком, а ребенок должен был унаследоваться от базы.
  • Вызов должен был быть к ребенку, а не к родителю

Снова, большое извинение и спасибо тем, кто ответил, пытаясь понять мою ужасную рецензию.

Исправлено.

Ответы [ 2 ]

42 голосов
/ 31 марта 2012

РЕДАКТИРОВАТЬ : этот ответ правильный, хотя Уэйн является более рубиновым способом решения проблемы.

Да, это так.

Ваша реализация будет не работает, потому что родитель пытается разрешить EWOK локально.Родитель не имеет EWOK.Тем не менее, вы можете сказать Ruby, чтобы он специально смотрел на класс фактического экземпляра, к которому был вызван метод, чтобы получить EWOK.

this будет работать:

class Parent
  def go
    self.class::EWOK
  end
end

class Child < Parent
  EWOK = "Ewoks Rule"
end

class Child2 < Parent
  EWOK = "Ewoks are ok, I guess"
end

bob = Child.new
bob.go  # => "Ewoks Rule"

joe = Child2.new
joe.go  # => "Ewoks are ok, I guess"

что здесь происходит: в родителе «go» «я» будет ссылаться на экземпляр объекта, который на самом деле вызывается «go».то есть Боб (Ребенок) или Джо (Ребенок2).self.class получает фактический класс этого экземпляра - Child в случае bob или Child2 в случае joe.затем self.class :: EWOK извлечет EWOK из правильного класса.

12 голосов
/ 31 марта 2012

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

class Parent

  def ewok
    "Ewoks are lame"
  end

end

class Child < Parent

  def ewok
    "Ewoks rule"
  end

end

p Parent.new.ewok    # Ewoks are lame
p Child.new.ewok     # Ewoks rule

Если константа дорогая для инициализации (например, большой хэш), определите ее в константе, но получите доступ к ней с помощью метода:

class Parent

  EWOK = {
    # Enormous hash...
  }

  def ewok
    EWOK
  end

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