Неопределенная константа Ruby NameError

У меня есть следующий код: http://scrp.at/FB

# Error:
# bin/rpg:5:in `<main>': uninitialized constant RubyPasswordGenerator::Korben (NameError)

В файле "bin/rpg"

#!/usr/bin/env ruby

require_relative "../lib/ruby_password_generator"

puts RubyPasswordGenerator::Korben.new

В "lib/ruby_password_generator.rb"

require_relative "ruby_password_generator/ruby_password_generator"
require_relative "ruby_password_generator/password_generator"
require_relative "ruby_password_generator/version"

# DEBUG
require "pp"

module RubyPasswordGenerator
end

require_relative "ruby_password_generator/algo/korben"

В "algo/korben.rb"

module RubyPasswordGenrator

  class Korben

    M_LOWERCAS_LETTERS    = ("a".."z").to_a
    M_UPPERCASE_LETTERS   = ("A".."Z").to_a
    M_NUMBERS             = (0..9).to_a
    M_SPECCIAL_CHARACTERS = "!@#()_-+=[]{}".split("")

    def initialize(length = 42)
      raise ArgumentError unless length.is_a?(Integer)
      raise ArgumentError unless length >= 3 && length <= 255

      @length = length
    end

    def generate
      password = ""
      (0...@length).each do
        char = (M_LOWERCAS_LETTERS + M_UPPERCASE_LETTERS + M_NUMBERS + M_SPECCIAL_CHARACTERS).shuffle.sample
        password << char
      end

      password
    end

  end
end

Структура файла выглядит так:

# .
# ├── Gemfile
# ├── Gemfile.lock
# ├── LICENSE.markdown
# ├── NERD_tree_3
# ├── README.markdown
# ├── Rakefile
# ├── bin
# │   └── rpg
# ├── lib
# │   ├── ruby_password_generator
# │   │   ├── algo
# │   │   │   ├── korben.rb
# │   │   │   └── marvin.rb
# │   │   ├── helpers
# │   │   ├── password_generator.rb
# │   │   ├── ruby_password_generator.rb
# │   │   └── version.rb
# │   └── ruby_password_generator.rb
# ├── ruby_password_generator.gemspec
# └── spec
#     ├── algo
#     │   ├── korben_spec.rb
#     │   └── marvin_spec.rb
#     ├── password_generator_spec.rb
#     ├── ruby_password_generator_spec.rb
#     └── spec_helper.rb
#
# 7 directories, 19 files

Я действительно не знаю, почему я получаю ошибку uninitialized constant "NameError". Я правильно включил файл, используя require_relative. Я также пробовал автозагрузку и требование, но это ничего не решило. Я использую рубин 1.9.2-p180. Если кто-нибудь знает, что происходит, пожалуйста, объясните мне.


person Robert Audi    schedule 13.03.2011    source источник
comment
Я переформатировал макет файла в вашем образце, чтобы сделать его более читабельным. Если это неправильно, отредактируйте свой вопрос и откатите его, чтобы удалить изменения.   -  person the Tin Man    schedule 13.03.2011


Ответы (1)


module RubyPasswordGenrator
  class Korben

Вам не хватает буквы e в имени модуля. Таким образом, класс Korben существует в модуле RubyPasswordGenrator, а не в модуле RubyPasswordGenerator, а RubyPasswordGenerator::Korben действительно не существует.

person sepp2k    schedule 13.03.2011
comment
Я такой идиот. Я застрял на этом в течение длительного времени. Мне нужно научиться печатать. Большое спасибо и извините за мой идиотизм. - person Robert Audi; 13.03.2011
comment
@Aziz Light, добавьте -wW2 к строке #! или когда вы вызываете Ruby, чтобы включить более подробные предупреждения. Руби, вероятно, рассказала бы вам об этом. - person the Tin Man; 13.03.2011
comment
@The Tin Man: я не думаю, что предупреждения обнаружат, что одно постоянное имя очень похоже на другое. Это не похоже на предупреждение о несуществующих переменных экземпляра. Кроме того, вы уверены, что это -wW2? - person Andrew Grimm; 14.03.2011
comment
Метод или класс с ошибкой в ​​ссылке должен генерировать предупреждение при включении уровня подробного предупреждения. -w означает включить предупреждения, -W2 означает установить максимальный уровень предупреждений. 2 используется по умолчанию, но я использую его, чтобы он был явным. Это должно вернуть больше полезной информации при отладке проблемы. Это не повредит и поможет отловить переменные с ошибками при разработке. - person the Tin Man; 14.03.2011
comment
@theTinMan: неправильное написание имен классов или модулей вызывает неопределенные постоянные ошибки, а не предупреждения. - person sepp2k; 14.03.2011