Ruby“实例变量未初始化”警告

时间:2010-01-20 02:52:30

标签: ruby

在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

如何摆脱此警告?这样做的惯用方法是什么?

5 个答案:

答案 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