2010-01-20 130 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 –

相關問題