我在Ruby中破解了链接列表的简单实现,但我发现了一些非常特殊的内容。
我创建了一个let wishes = searchDataBase()
类,List
到attr_accessor
。像这样:
first_node
然后,在实现方法class List
attr_accessor :first_node
# Some code here ...
end
时,我遇到了以下错误
delete_at
这是方法的一部分:
linearly.rb:39:in `delete_at': undefined method `next' for nil:NilClass (NoMethodError)
from linearly.rb:81:in `<main>'
我忘了使用类变量def delete_at(position)
if position == 0
deleted_node = first_node
first_node = first_node.next # This is line 39.
return deleted_node
else
# More code here ...
,而是使用了读者方法@first_node
。然后,我开始想知道为什么first_node
在同一行中使用first_node
时返回nil
。
在设置新值之前,是否将first_node=
设置为@first_node
?
请注意,这段代码工作正常:
nil
修改
这就是我调用实现的方式:
def delete_at(position)
if position == 0
deleted_node = first_node
first_node = deleted_node.next
return deleted_node
else
# Some code here ...
答案 0 :(得分:3)
此:
first_node = first_node.next
创建一个名为first_node
的局部变量。变量声明被提升到Ruby的范围顶部,因此您的方法等同于:
def delete_at(position)
deleted_node = nil # Declare deleted_node and first_node
first_node = nil # as local variables.
if position == 0
deleted_node = first_node
first_node = deleted_node.next
return deleted_node
else
# Some code here ...
这意味着您的方法中的所有first_node
引用都将是本地first_node
变量,而不是attr_accessor
为您创建的getter和设置方法。
要么不使用与方法名称匹配的变量,要么通过为方法调用提供self
接收器来明确您的意思:
def delete_at(position)
if position == 0
deleted_node = self.first_node
self.first_node = deleted_node.next
#...
答案 1 :(得分:0)
你确定已经设置了@first_node吗?未设置时,实例变量将返回nil。
class Test
attr_accessor :foo
def print_foo
puts "@foo=[#{@foo}]"
puts "foo=[#{foo}]"
puts @foo.nil?
end
end
t1 = Test.new
t1.foo # => nil
t1.print_foo # prints "@foo=[]" and "foo=[]" and returns true