2010-01-20 79 views
7

写作中存在的红宝石一些“学习语言”的代码,作为一个LinkedList实现的一部分,我碰到这个警告是:红宝石“实例变量未初始化”警告

中的“添加”方法,头如果它不存在,即

def add(value) 
    new_node=LinkedListNode.new(value) 
    if [email protected] 
    @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

这是一个可怕的警告是简单的答案... – Kevin

回答

15

除了Matchu的建议,你也可以使用defined?初始化@head懒洋洋地在这里不会引发警告:

if defined? @head 
    ... 
else 
    @head = new_node 
end 

对于这样的事情正常的成语是

@head ||= new_node 

这将也不会引起警告,但在这种情况下,似乎你需要做一些事情,如果@head没有定义,并且它不是幂等的,所以||=不会在此工作得很好案件。 ||=也具有不能区分假,无或未定的缺点。初始化初始化为nil可能是最佳选择。

9

您可以在initialize方法中声明@headnil

-4

如果不存在@head,则不能执行!操作。你需要先初始化它。您应该声明它为nil

+3

可以在未初始化的情况下进行无功'',它只是你会得到一个警告;! ) – horseyguy

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 
+0

增加值将不会正确解析为方法名称 其他所有内容均为honky dory –

相关问题