Как использовать переопределенную константу в наследуемом классе - PullRequest
31 голосов
/ 04 июля 2010

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

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

Ответы [ 4 ]

73 голосов
/ 04 июля 2010
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 голосов
/ 13 ноября 2017

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

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

Если у вас есть точные определения классов, как у Константина, но вы добавляете метод к классу A, например:Тогда вы оба раза получите 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
2 голосов
/ 05 июля 2013

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

Я должен был явно обратиться к классу.

self.class::CONST

ура

1 голос
/ 17 июня 2016

В случае, если кто-нибудь найдет это и использует вместо этого расширение модуля, просто используйте

self::CONST

...