Получить дочернюю константу в родительском методе - 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]
Ничего себе, я ДЕЙСТВИТЕЛЬНО жалко парней. Я полностью испортил объяснение.
- Родитель должен был иметь дочерние и дочерние элементы, унаследованные от базы.
- Вызов должен был быть дочерним, а не родительским.
Опять же, многие извинения и благодарность тем, кто ответил, пытаясь понять мою ужасную запись.
Теперь он исправлен.
Ответы
Ответ 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