2009-03-29 9 views
7

Tengo un método como este:En un método que toma varios parámetros opcionales, ¿cómo se puede especificar alguno excepto el primero?

def foo(fruit='apple', cut="sliced", topping="ice cream") 
    # some logic here 
end 

¿Cómo puedo llamarlo donde sólo anular el parámetro de relleno pero el uso de los valores por defecto para los demás, algo como esto

foo('','','hot fudge') 

Por supuesto, esto no funciona según lo previsto, pero solo deseo proporcionar un valor para el tercer parámetro opcional, y los dos primeros se quedan con sus valores predeterminados. Sé cómo hacer esto con un hash, pero ¿es una forma abreviada de hacerlo, usando la sintaxis anterior?

Respuesta

17

No puede usar esta sintaxis para hacer esto en ruby. Yo recomendaría la sintaxis hash para esto.

def foo(args={}) 
    args[:fruit] ||= 'apple' 
    args[:cut]  ||= 'sliced' 
    args[:topping] ||= 'ice cream' 
    # some logic here 
end 

foo(:topping => 'hot fudge') 

También puede hacerlo utilizando argumentos posicionales:

def foo(fruit=nil,cut=nil,topping=nil) 
    fruit ||= 'apple' 
    cut  ||= 'sliced' 
    topping ||= 'ice cream' 
    # some logic here 
end 

foo(nil,nil,'hot fudge') 

tener en cuenta que estas dos técnicas evitará que le pase reales nil argumentos a las funciones (cuando es posible que desee a veces)

2

No. Tiene que verificar el valor de los parámetros dentro de la función foo. Si son la cadena vacía, o nula, puede establecerlos en el parámetro predeterminado.

15

a partir de Rubí 2.0, se puede utilizar argumentos de palabra clave:

def foo(fruit: 'apple', cut: "sliced", topping: "ice cream") 
    [fruit, cut, topping] 
end 

foo(topping: 'hot fudge') # => ['apple', 'sliced', 'hot fudge'] 
+0

Y a partir de Ruby 2.1 hay soporte para 'argumentos de palabras clave obligatorios', ver [notas de la versión] (https://github.com/ruby/ruby/blob/ruby_2_1/NEWS#L16-17) – Epigene

Cuestiones relacionadas