2009-02-24 12 views
55

Sé que esto puede ser una pregunta estúpida, pero no sé cómo crear un método de ruby ​​que acepte un hash de parámetros. Es decir, en los carriles que me gustaría utilizar un método como este:Crear un método de ruby ​​que acepte un hash de parámetros

login_success :msg => "Success!", :gotourl => user_url 

¿Cuál es el prototipo de un método que acepta este tipo de parámetros? ¿Cómo los leo?

Respuesta

59

Si pasa los parámetros de una función Ruby en sintaxis hash, Ruby asumirá que ese es su objetivo. Por lo tanto:

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

¿No puedo usar algo como login_success (* params)? – collimarco

+5

a * (alias operador splat) significa que el método acepta cualquier número de argumentos y los pondrá en una matriz llamada params. Decidir si usarlo o no depende de lo que está buscando. En el ejemplo que proporcionó, un hash tiene sentido. – Allyn

+6

Eso dice que esperas cualquier cantidad de argumentos. Como 'foo (1,: b, '3')'. Además, no necesita la parte "= {}" de eso. esto funcionará bien: def login_success (hash). El código anterior simplemente establece el valor predeterminado como un hash vacío. –

30

Una clave para recordar es que sólo se puede hacer la sintaxis donde se deja a los personajes de hash {}, si el parámetro hash es el último parámetro de una función. Entonces puedes hacer lo que Allyn hizo, y eso funcionará. También

def login_success(name, hsh) 
    puts "User #{name} logged in with #{hsh[:some_hash_key]}" 
end 

Y se le puede llamar con

login_success "username", :time => Time.now, :some_hash_key => "some text" 

Pero si el hash no es el último parámetro que tiene que rodear los elementos hash con {}.

5

Use un solo argumento. Rubí va a transformar los valores con nombre en un hash:

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

Si realmente quiere asegurarse de obtener un hash, en lugar de la tipificación de pato rubí por defecto, entonces usted puede necesitar para controlar por ello. Algo como, por ejemplo:

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

Con el advenimiento de argumentos de palabra clave en Ruby 2.0 ahora se puede hacer

def login_success(msg:"Default", gotourl:"http://example.com") 
    puts msg 
    redirect_to gotourl 
end 

en Ruby 2.1 se puede dejar de lado los valores por defecto,

def login_success(msg:, gotourl:) 
    puts msg 
    redirect_to gotourl 
end 

Cuando se llama, omitir un parámetro que no tiene un valor predeterminado aumentará un ArgumentError

+2

Es posible que también desee mencionar que puede omitir los valores predeterminados en Ruby 2.1 para establecer los parámetros necesarios, p. 'def login_success (msg :, gotourl:)' dará como resultado un error al intentar llamar a 'login_success' sin que se especifiquen los parámetros' msg' y 'gotourl'. – Ajedi32

Cuestiones relacionadas