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

Как использовать переопределенную константу в наследуемом классе

с учетом этого кода:

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

4b9b3361

Ответ 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'

Ответ 2

Извините, я не смог заставить форматирование кода работать в "комментарии" только в "ответе", но это в ответ на акостадинов вопрос Хендрику "как это отличается от ответа его [Константина]?"

Я бы предположил, что Хендрик пытался получить доступ к константе из методов в своем классе наследования, и это зависит от того, является ли это экземпляром или статическим методом. Кажется, он ведет себя так, как вы ожидали бы в методе экземпляра. Но может быть, а может и не так, как вы ожидаете статического метода. Даже если это не то, что имел в виду Хендрик, это может быть стоит отметить:

Если у вас есть точные определения классов как Константин, но вы добавляете метод в класс 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

Ответ 3

У меня было несколько проблем с решением Константина Хаазе. При доступе к константе в экземпляре объекта наследующего класса использовалась родительская константа.

Мне пришлось явно ссылаться на класс.

self.class::CONST

веселит

Ответ 4

Если кто-то найдет это и использует расширение модуля, просто используйте

self::CONST