Подтвердить что ты не робот

Получить дочернюю константу в родительском методе - Ruby

В 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]

Ничего себе, я ДЕЙСТВИТЕЛЬНО жалко парней. Я полностью испортил объяснение.

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

Опять же, многие извинения и благодарность тем, кто ответил, пытаясь понять мою ужасную запись.

Теперь он исправлен.

4b9b3361

Ответ 1

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

Да, это так.

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

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

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"

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

Ответ 2

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

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