gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:52:03 25 4
gpt4 key购买 nike

我在做exercises和我运行 test_ex47.rb 时出现 NameError:Unitialized Constant MyUnitTests::Room

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 位于 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

错误:

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]

最佳答案

这里的问题是您在第 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

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

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

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

关于Ruby 名称错误 - 未初始化的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com