Ruby 链表类初始化错误

Ruby 链表类初始化错误,ruby,linked-list,minitest,Ruby,Linked List,Minitest,我需要一个定义了方法的类。我甚至把它放在一个attr_访问器中,我很确定它是否完全多余。但无论我把它放在何处或如何放置,我都无法摆脱这个错误NoMethodError:undefined方法next_node for nil:NilClass。我正在运行minitest来使用TDD,我在这一点上超级挂断了 编辑当我测试list.head.next_节点时,我试图返回一个nil值 这是我的测试方法 def test_does_head_move_value_to_next_node lis

我需要一个定义了方法的类。我甚至把它放在一个attr_访问器中,我很确定它是否完全多余。但无论我把它放在何处或如何放置,我都无法摆脱这个错误NoMethodError:undefined方法next_node for nil:NilClass。我正在运行minitest来使用TDD,我在这一点上超级挂断了

编辑当我测试list.head.next_节点时,我试图返回一个nil值

这是我的测试方法

def test_does_head_move_value_to_next_node
    list = LinkedList.new
    list.head.next_node
    # assert_nil list.head.next_node
end
LinkedList.new将调用您的初始化;未传输head参数,因此将指定默认值nil@head=head将在@head属性中存储nil

稍后,您的list.head使用完全不必要的访问器,并返回先前存储在那里的nil。然后,next_节点被发送到nil,但NilClass没有定义这样的方法。为了让list.head.next_节点调用next_节点方法,@head必须是LinkedList对象,而不是nil

如果您希望保护自己不受此影响,您可以使用:

list.head.next_node if list.head
或者使用安全导航操作符&。由Ruby 2.3引入,它将检查左侧是否为nil,如果是,则返回nil,如果不是,则调用该方法:

list.head&.next_node
编辑:代码中还有一个微妙的bug是无害的,但在其他情况下可能会做一些完全出乎意料的事情

@next_node = next_node
由于您尚未在initialize方法中定义next_node变量,Ruby将得出结论,您希望调用访问器。此访问器将返回@next\u node,因此您最终将执行@next\u node=@next\u node。幸运的是,@next_节点已经以nil开始,因此赋值虽然完全不必要,但至少没有失败

但是,如果您自己定义了访问器,请这样说:

def next_node
  @next_node ||= LinkedList.new
end

返回@next_节点;如果为nil,则首先创建一个新的空LinkedList,将其设置为@next_node并返回该值,那么您将遇到真正的麻烦,因为如果您现在说LinkedList.new,您将尝试为@next_node分配LinkedList.new,它将尝试为其@next_node分配LinkedList.new,它将尝试为其@next_node分配LinkedList.new,哪个将…Ctrl-C

所有这些将修复未定义的方法错误?我现在正在运行minitest和jsut,主要关注这一步。我想我的下一步是断言\u nil list.head.next\u节点,因为我试图让它返回nil。此外,当在pry会话中调用时,我会得到我正在寻找的nil结果。我只是无法在这里的代码中实现它来清除错误。所有这些都试图修复您的理解:如果list.head为nil,则无法计算list.head.next\u节点。list.head&.next_node可以,在这种情况下会计算为零。好的,我想我的理解在一夜之间点击了@Amadan。我可能应该在评论之前先睡一觉。很抱歉,:P.你是说我的代码在非测试运行时的编写方式会导致无限循环?不,如果你添加了我编写的代码,这只是一个假设。事实上,这句话毫无用处。不过,这确实解释了,谢谢你:我的测试把我搞砸了。我没有在测试文件中添加任何内容,这意味着它为零,无法读取D
def next_node
  @next_node ||= LinkedList.new
end