У меня есть простой класс, который определяет некоторые константы, например ::
module Foo
class Bar
BAZ = "bof"
...
Все - щенки и радуга, пока я не скажу Рейку, чтобы я выполнил все мои Test::Unit
тесты. Когда это происходит, я получаю предупреждения:
bar.rb:3: warning: already initialized constant BAZ
Моя привычка состояла в том, чтобы избегать этих предупреждений, делая постоянную инициализацию условной, например, :
...
BAZ = "bof" unless const_defined? :BAZ
...
Кажется, это решает проблему, но это немного утомительно, и я никогда не видел, чтобы кто-нибудь еще инициализировал константы таким образом. Это заставляет меня думать, что я могу делать это неправильно. Есть ли лучший способ инициализировать константы, которые не будут генерировать предупреждения?
Обновление : немного подробнее о том, как я использую эти константы, скажем, я определил класс Token
, который имеет константы для всех символов, которые являются частью синтаксис какого-то искусственного языка. У меня также есть класс Scanner
, который читает поток символов, генерируя экземпляр Token
для каждого из них.
module Foo
class Token
LPAREN = "("
RPAREN = ")"
...
end
class Scanner
def next_token
case read_char()
when Token::LPAREN: # Generate a new LPAREN token
...
То есть, проверяя, какой токен должен быть сгенерирован для данного символа, я хочу использовать константы, определенные в Token
.
Обновление 2 : Ответ Йерга показал, что проблема, вероятно, заключалась в том, как я строил пути в моих require
выражениях, а не в том, как я инициализировал или использовал константы. Я переписал свои require
операторы, чтобы исключить любое ручное создание пути, например ::
# File: $PROJECT_ROOT/lib/foo.rb; trying to load $PROJECT_ROOT/lib/foo/bar.rb
require File.expand_path(File.dirname(__FILE__)) + "foo/bar"
теперь написано, чтобы полагаться на $LOAD_PATH
:
# File: $PROJECT_ROOT/lib/foo.rb; trying to load $PROJECT_ROOT/lib/foo/bar.rb
require 'lib/foo/bar'
Я удалил условные проверки из своих константных операторов инициализации, и rake теперь запускает модульные тесты, не выдавая никаких предупреждений.