Как правильно инициализировать константу в Ruby?

У меня есть простой класс, который определяет некоторые константы, например:

module Foo
  class Bar
    BAZ = "bof"
    ...

Все - щенки и радуги, пока я не скажу Рейку запустить все мои Test :: Unit тесты. Когда это происходит, я получаю предупреждения:

bar.rb:3: warning: already initialized constant BAZ

Моя привычка состояла в том, чтобы избегать этих предупреждений, делая постоянную инициализацию условной, например:

...
BAZ = "bof" unless const_defined? :BAZ
...

Кажется, это решает проблему, но это немного утомительно, и я не когда-либо видели, что кто-то еще инициализирует константы таким образом. Это заставляет меня думать, что я делаю это неправильно. Есть ли лучший способ инициализировать константы, которые выиграли? t генерировать предупреждения?

Обновление : В качестве более подробной информации о том, как я использую эти константы, скажем, я определил класс 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 теперь запускает модульные тесты без выдачи предупреждений.

10
задан Community 23 May 2017 в 12:07
поделиться