2012-05-08 14 views
19

Soy nuevo en Ruby y encontré algo que me confundió un poco.¿Por qué los valores de parámetro predeterminados de Ruby no se asignan a argumentos nulos?

Establezco un valor de parámetro predeterminado en una firma de método.

Al llamar al método, pasé un argumento nil a ese parámetro.

Pero el valor predeterminado no se asignó; permaneció nil.

# method with a default value of 1000 for parameter 'b' 
def format_args(a, b=1000) 
    "\t #{a.ljust(30,'.')} #{b}" 
end 

# test hash 
dudes = {}; 
dudes["larry"] = 60 
dudes["moe"] = nil 

# expecting default parameter value 
puts "Without nil check:" 
dudes.each do |k,v|  
    puts format_args(k,v) 
end 

# forcing default parameter value 
puts "With nil check:" 
dudes.each do |k,v|  
    if v 
    puts format_args(k,v) 
    else 
    puts format_args(k) 
    end 
end 

Salida:

Without nil check: 
    larry......................... 60 
    moe........................... 
With nil check: 
    larry......................... 60 
    moe........................... 1000 

¿Este comportamiento esperado?

¿Qué ruby-foo me falta?

Parece que nil no es lo mismo "sin valor" que estoy acostumbrado a pensar en null en otros idiomas.

+3

¿Qué otro lenguaje utilizaría el valor predeterminado si le das 'null' ?! 'null' es un valor adecuado en cualquier idioma que conozco que usa' null', al igual que 'nil' es un valor apropiado en Ruby. –

+0

Al pasar un valor a la función, cualquier valor, incluso 'nil' para _no value_, anula el valor predeterminado. Si desea el valor predeterminado, omita el argumento. –

+0

Sí, tienes toda la razón. No es que otros idiomas lo traten de manera diferente; es que mis modelos mentales están estropeados y me está llevando un poco recuperar mi cabeza en el código ... –

Respuesta

41

El parámetro predeterminado se utiliza cuando el parámetro no se proporciona.

Si lo proporciona como nil, entonces será nil. Entonces sí, este es el comportamiento esperado.

0

En Ruby, los métodos siempre devuelven algo. A veces, no hay nada que devolver (la consulta en la base de datos aparece vacía o algo así). nil es para esos casos; Significa algo así como 'nada aquí', pero es una referencia a un objeto. Para obtener el comportamiento que desea, simplemente no pase ningún parámetro.

def talk(msg="Hello") 
    puts msg 
end 

talk #=> "Hello" 
+4

O use 'nil' como el argumento predeterminado y haga un' msg || = "Hello" 'dentro de la función. –

0

Probar ... v.is_nil? en la instrucción if.

26

Si desea establecer un valor por defecto, incluso si se pasa a cero, y aún así permitir que una llamada al método sin argumentos que necesita para establecer el valor predeterminado a cero y el uso de la "o es igual a" operador:

def foo(bar=nil) 
    bar ||= "default value" 
    puts bar 
end 
Cuestiones relacionadas