【问题标题】:Ruby undefined constant NameErrorRuby 未定义常量 NameError
【发布时间】:2011-07-14 11:10:27
【问题描述】:

我有以下代码: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。 如果有人知道发生了什么,请解释一下。

【问题讨论】:

  • 我重新格式化了您示例中的文件布局,使其更具可读性。如果不正确,请编辑您的问题并将其回滚以删除更改。

标签: ruby class require


【解决方案1】:
module RubyPasswordGenrator
  class Korben

您在模块名称中缺少 e。因此,Korben 类存在于RubyPasswordGenrator 模块而不是RubyPasswordGenerator 模块中,RubyPasswordGenerator::Korben 确实不存在。

【讨论】:

  • 我真是个白痴。我已经坚持了很长时间。我需要学习打字。非常感谢,对不起我的白痴。
  • @Aziz Light,将-wW2 添加到您的#! 行,或者在您调用Ruby 时打开更详细的警告。 Ruby 可能会告诉你。
  • @the Tin Man:我认为警告不会检测到一个常量名称与另一个非常相似。这不像警告不存在的实例变量。另外,你确定是-wW2?
  • 当您打开详细警告级别时,引用中拼写错误的方法或类应生成警告。 -w 表示打开警告,-W2 表示将警告设置为最高级别。 2 是默认值,但我使用它,所以它是明确的。在调试问题时,这样做应该会返回更多有用的信息。它不会造成伤害,并且有助于在开发过程中发现拼写错误的变量。
  • @theTinMan:拼写错误的类或模块名称会导致“未定义常量”错误,而不是警告。
猜你喜欢
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多