2010-01-20 6 views
7

Al escribir un poco de "aprendizaje de la lengua" código en rubí, como parte de una aplicación LinkedList, me encontré con esta advertencia:Ruby "variable de instancia no se ha iniciado", advirtiendo

En el método de "añadir", la cabeza es creado si no existe ya, es decir

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 

entonces consigo la advertencia

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

¿Cómo me deshago de esta advertencia? ¿Cuál es la forma idiomática de hacer esto?

+0

Es una terrible advertencia es la respuesta corta ... – Kevin

Respuesta

15

Además de la sugerencia de Matchu, también se puede utilizar defined? para inicializar @head perezosamente aquí sin provocar la advertencia:

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

El lenguaje normal para este tipo de cosas es

@head ||= new_node 

que será tampoco provoque la advertencia, pero en este caso parece que necesita hacer algo si no se definió @head, y no es idempotente, por lo que ||= no va a funcionar muy bien en este caso. ||= también tiene la desventaja de no poder distinguir entre falso, nulo o desarmado. Inicializar a nil en inicializar es probablemente la mejor opción.

9

Usted podría declarar @head como nil en el método initialize, por una.

-4

No puede realizar la operación ! en @head si no existe. Primero debe inicializarlo. Probablemente deberías declararlo como nil.

+3

puede realizar '' en una instancia sin inicializar var, es sólo que obtendrá una advertencia;!) – horseyguy

0

Se podría hacer algo como:

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

agregar valor no se analizará correctamente como un nombre de método todo lo demás es honky dory –

Cuestiones relacionadas