Ruby “红宝石”;实例变量未初始化";警告
在用ruby编写一些“学习语言”代码时,作为linkedList实现的一部分,我遇到了以下警告: 在“添加”方法中,如果头部不存在,则创建头部,即Ruby “红宝石”;实例变量未初始化";警告,ruby,Ruby,在用ruby编写一些“学习语言”代码时,作为linkedList实现的一部分,我遇到了以下警告: 在“添加”方法中,如果头部不存在,则创建头部,即 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 然后我得到了警告 ..
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
我如何摆脱这个警告?这样做的惯用方法是什么?你可以在
初始化方法中将@head
声明为nil
。你不能执行如果@head
不存在,则对其执行code>操作。你需要先初始化它。您可能应该将其声明为nil
除了Matchu的建议之外,您还可以使用定义?
在这里惰性地初始化@head
,而不引发警告:
if defined? @head
...
else
@head = new_node
end
这类事情的惯用语是
@head ||= new_node
这也不会引发警告,但在本例中,如果未定义@head
,并且它不是幂等的,则似乎需要执行一些操作,因此|124;=
在本例中不会很好地工作<代码>| 124;=
还有一个缺点,就是无法区分false、nil或unset。在初始化中初始化为nil
可能是最佳选择。您可以执行以下操作:
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
我认为,在这些情况下,最好使用本机attr\u访问器
,而不是定义的?
检查,例如:
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
您可以执行代码>在未初始化的实例变量上,只会得到一个警告;)这是一个可怕的警告,答案很短……add-value将无法正确解析为方法名,其他一切都是胡说八道