在Ruby中编写一些“学习语言”代码时,作为linkList实现的一部分,我遇到了这个警告:
在“添加”方法中,如果头部尚不存在,则创建头部,即
def add(value)
new_node=LinkedListNode.new(value)
if !@head
@head=new_node
else
self.find {|node| node.next ==nil }.next=new_node
end
end
然后我收到警告
.../linked_list.rb:13: warning: instance variable @head not initialized
如何摆脱此警告?这样做的惯用方法是什么?
答案 0 :(得分:20)
除了Matchu的建议外,您还可以使用defined?
懒惰地初始化@head
,而不会引发警告:
if defined? @head
...
else
@head = new_node
end
这种事情的正常习惯是
@head ||= new_node
这也不会引发警告,但是在这种情况下,如果@head
没有被定义,你似乎需要做一些事情,并且它不是幂等的,所以||=
不会起作用在这种情况下。 ||=
也有缺点,无法区分假,零或未设置。在初始化中初始化为nil
可能是最佳选择。
答案 1 :(得分:10)
您可以在@head
方法中将nil
声明为initialize
。
答案 2 :(得分:0)
您可以执行以下操作:
def position
self.find {|node| node.next.nil? }
end
def head
@head ||= nil
end
def add value
node = LinkedListNode.new(value)
head ? position.next = node : @head = node
end
答案 3 :(得分:0)
我认为,在这种情况下,最好在attr_accessor
检查中使用本机defined?
,例如:
attr_accessor :head
def add(value)
new_node=LinkedListNode.new(value)
if !head
self.head=new_node
else
self.find {|node| node.next ==nil }.next=new_node
end
end
答案 4 :(得分:-4)
如果!
不存在,则无法对其进行@head
操作。您需要先将其初始化。您应该将其声明为nil
。