Я пытаюсь сделать то, что я описал в названии, потому что я хочу использовать значение переменной класса подкласса в родительском. На самом деле, я нашел способ сделать это, но я чувствую, что могу сделать что-то приятнее. Вот мой текущий код:Ruby: разделите переменную класса между родительским классом и его подклассами
class Parent
def self.test_settings
const_set "PATH", "/tmp/#{self.name}"
end
end
class Sub1 < Parent
def self.name
"one"
end
test_settings if Rails.env.test?
end
class Sub2 < Parent
def self.name
"two"
end
test_settings if Rails.env.test?
end
Моя оригинальная версия - что не работает, является:
class Parent
def self.test_settings
const_set "PATH", "/tmp/#{@@name}"
end
test_settings if Rails.env.test?
end
class Sub1 < Parent
@@name = "sub1"
end
class Sub2 < Parent
@@name = "sub2"
end
поясню: я использовал метод класса вместо переменной (@ @name), который я пробовал до безуспешно. Кроме того, мне пришлось переместить вызов функции test_settings if Rails.env.test?
в подклассы, потому что он рассмотрит self
как родительский класс, если я поместил там этот код.
Я бы по достоинству оценил любые предложения по его улучшению и почему моя оригинальная идея (используя имя @@ и вызов метода test_settings в родительском классе) не работает.
у вас есть те же опечатки ('Paernt' вместо' Parent', 'Rail' вместо' Rails ') в вашем коде? –
'@@ name' называется переменной * класса *, которая даст вам самое последнее значение и является переменной _shared_ через наследование. Другой вопрос я не пожалел. :) –
Обратите внимание, что реализация 'self.name' overwrites/shadows [' Module # name'] (http://ruby-doc.org/core-2.2.1/Module.html#method-i-name) – Stefan