Ответ 1
class A
CONST = 'A'
def initialize
puts self.class::CONST
end
end
class B < A
CONST = 'B'
end
A.new # => 'A'
B.new # => 'B'
с учетом этого кода:
class A
CONST = 'A'
def initialize
puts CONST
end
end
class B < A
CONST = 'B'
end
A.new # => 'A'
B.new # => 'A'
Я бы хотел, чтобы B
использовал определение CONST = 'B'
, но я не знаю, как это сделать. Любые идеи?
Привет
Tom
class A
CONST = 'A'
def initialize
puts self.class::CONST
end
end
class B < A
CONST = 'B'
end
A.new # => 'A'
B.new # => 'B'
Извините, я не смог заставить форматирование кода работать в "комментарии" только в "ответе", но это в ответ на акостадинов вопрос Хендрику "как это отличается от ответа его [Константина]?"
Я бы предположил, что Хендрик пытался получить доступ к константе из методов в своем классе наследования, и это зависит от того, является ли это экземпляром или статическим методом. Кажется, он ведет себя так, как вы ожидали бы в методе экземпляра. Но может быть, а может и не так, как вы ожидаете статического метода. Даже если это не то, что имел в виду Хендрик, это может быть стоит отметить:
Если у вас есть точные определения классов как Константин, но вы добавляете метод в класс A следующим образом:
def self.print_const
puts CONST
end
Затем вы получаете A оба раза:
A.print_const # prints A
B.print_const # prints A
Однако, если вы определяете метод в A, ссылаясь на класс:
def self.print_const
puts self::CONST
end
Затем вы получите:
A.print_const # prints A
B.print_const # prints B
У меня было несколько проблем с решением Константина Хаазе. При доступе к константе в экземпляре объекта наследующего класса использовалась родительская константа.
Мне пришлось явно ссылаться на класс.
self.class::CONST
веселит
Если кто-то найдет это и использует расширение модуля, просто используйте
self::CONST