Ruby 名称错误 - 未初始化的常量

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10328440/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 05:04:00  来源:igfitidea点击:

Ruby Name Error - Uninitialized constant

rubylearn-ruby-the-hard-way

提问by septerr

I am doing exercisesand am getting NameError:Unitialized Constant MyUnitTests::Roomwhen running test_ex47.rb.

我正在做练习并且NameError:Unitialized Constant MyUnitTests::Room在运行 test_ex47.rb时得到了。

test_ex47.rb:

test_ex47.rb:

require 'test/unit'
require_relative '../lib/ex47'

class MyUnitTests < Test::Unit::TestCase
    def test_room()
        gold = Room.new("Gold Room", """This room has gold in it you can grab. There's a doo to the north.""")
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, {})
end

def test_room_paths()
    center = Room.new("Center", "Test room in the center.")
    north = Room.new("North", "Test room in the north.")
    south = Room.new("South", "Test room in the south.")

    center.add_paths({:north => north, :south => south})
    assert_equal(center.go(:north), north)
    assert_equal(center.go(:south), south)
end

def test_map()
    start = Room.new("Start", "You can go west and down a hole.")
    west = Room.new("Trees", "There are trees here, you can go east.")
    down = Room.new("Dungeon", "It's dark down here, you can go up.")

    start.add_paths({:west => west, :down => down})
    west.add_paths({:east => start})
    down.add_paths({:up => start})

    assert_equal(start.go(:west), west)
    assert_equal(start.go(:west).go(:east), start)
    assert_equal(start.go(down).go(up), start)
end

end

ex47.rb is located in the lib folder and looks like:

ex47.rb 位于 lib 文件夹中,如下所示:

class Room
aatr_accessor :name, :description, :paths

def initialize(name, description)
    @name = name
    @description = description
    @paths = {}
end

def go(direction)
    @paths[direction]
end

def add_paths(paths)
    @paths.update(paths)
end
end

Error:

错误:

Finished tests in 0.000872s, 3440.3670 tests/s, 0.0000 assertions/s.

  1) Error:
test_map(MyUnitTests):
NameError: uninitialized constant MyUnitTests::Room
    test_ex47.rb:22:in `test_map'

  2) Error:
test_room(MyUnitTests):
NameError: uninitialized constant MyUnitTests::Room
    test_ex47.rb:6:in `test_room'

  3) Error:
test_room_paths(MyUnitTests):
NameError: uninitialized constant MyUnitTests::Room
    test_ex47.rb:12:in `test_room_paths'

3 tests, 0 assertions, 0 failures, 3 errors, 0 skips]

回答by Samwhoo

The problem here is that you are creating a Room object inside the MyUnitTests class on line 3. Ruby thinks you want to use a class called MyUnitTest::Room, which doesn't exist. You need to use an absolute class reference, like so:

这里的问题是您在第 3 行的 MyUnitTests 类中创建了一个 Room 对象。Ruby 认为您想使用一个名为 MyUnitTest::Room 的类,但它并不存在。您需要使用绝对类引用,如下所示:

class MyUnitTests < Test::Unit::TestCase
    def test_room()
        gold = ::Room.new("Gold Room", """This room has gold in it you can grab. There's a doo to the north.""")
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, {})
end

Notice the :: before Room.new on line 3 there? That tells Ruby that you want to create a Room object from the top level name space :)

注意到第 3 行的 Room.new 之前的 :: 了吗?这告诉 Ruby 你想从顶级命名空间创建一个 Room 对象:)

I hope that answers your question.

我希望这能回答你的问题。

EDIT: You'll also need to change your other references to the Room class to ::Room. Sorry, I thought only the top one was a problem because of the indentation. A closer look reveals that the rest need the :: as well.

编辑:您还需要将对 Room 类的其他引用更改为 ::Room。抱歉,由于缩进,我认为只有顶部有问题。仔细观察就会发现,其余的也需要 ::。