Ruby “红宝石”;实例变量未初始化";警告

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 然后我得到了警告 ..

在用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
然后我得到了警告

.../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将无法正确解析为方法名,其他一切都是胡说八道