2010-01-20 19 views
7

Nello scrivere un po 'di "apprendimento della lingua" codice in Ruby, come parte di un'implementazione LinkedList, mi sono imbattuto in questo avvertimento:Ruby "variabile di istanza non inizializzata" avvertimento

Nel metodo "add", la testa è creato se non esiste già, cioè

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 

allora ottengo l'avvertimento

.../linked_list.rb:13: warning: instance variable @head not initialized 

Come faccio a sbarazzarsi di questo avviso? Qual è il modo idiomatico di farlo?

+0

E 'un terribile avvertimento è la risposta breve ... – Kevin

risposta

15

Oltre al suggerimento di Matchu, è anche possibile utilizzare defined? per inizializzare @head pigramente qui senza provocare l'avvertimento:

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

Il linguaggio normale per questo genere di cose è

@head ||= new_node 

che sarà inoltre non provocare l'avviso, ma in questo caso sembra che tu debba fare qualcosa se @head non è stato definito, e non è idempotente, quindi ||= non funzionerà molto bene in questo Astuccio. ||= ha anche lo svantaggio di non essere in grado di distinguere tra falso, nullo o non impostato. L'inizializzazione su nil in fase di inizializzazione è probabilmente la scelta migliore.

9

È possibile dichiarare @head come nil nel metodo initialize, per uno.

-4

Non è possibile eseguire l'operazione ! su @head se non esiste. È necessario inizializzarlo prima. Probabilmente dovresti dichiararlo come nil.

+3

è possibile eseguire '' su un inizializzato esempio var, è solo che si otterrà un avvertimento;!) – horseyguy

0

Si potrebbe fare qualcosa di simile:

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

il valore aggiunto non verrà analizzato correttamente come nome del metodo Tutto il resto è honky dory –

Problemi correlati