2011-03-15 18 views
9

Estoy usando Ruby on Rails 3 y estoy tratando de manejar un hash como argumento de función.Manejando un hash como un argumento de función

Por ejemplo, si digo una función de esta manera:

def function_name(options = {}) 
    ... 
end 

me gustaría pasar a la function_name un hash como

{"key1"=>"value_1", "key2"=>"value2", "..." => "..."} 

y luego usar que dentro de la función.

¿Cuál es el mejor \ común (Rails) forma de hacer eso?

P.S .: He visto el método extract_option! en alguna parte, pero no sé dónde puedo encontrar documentación y si la necesito para lograr lo que intento.

+0

Creo que significa esto: http://apidock.com/rails/Array/extract_options%21.Pero su ejemplo no lo aprovecha a menos que su firma sea "def function_name (* args)". Pasar un hash como opciones es completamente estándar y no tienes que hacer nada especial, como dice Jakub. – tokland

Respuesta

14

Sólo tiene que utilizar la definición que ya ha proporcionado:

def function_name(options = {}) 
    puts options["key1"] 
end 

llamada con:

function_name "key1" => "value1", "key2" => "value2" 

o

function_name({"key1" => "value1", "key2" => "value2"}) 

Array#extract_options! se utiliza simplemente con métodos que tienen los argumentos del método de variables como este :

def function_name(*args) 
    puts args.inspect 
    options = args.extract_options! 
    puts options["key1"] 
    puts args.inspect 
end 

function_name "example", "second argument", "key1" => "value" 
# prints 
["example", "second argument", { "key1" => "value" }] 
value 
["example", "second argument"] 

Otro método útil es Hash#symbolize_keys! que no le importa si transfiere cadenas o símbolos a su función para que siempre pueda acceder a este tipo de cosas, como options[:key1].

3

La forma en que lo ha declarado en su ejemplo funcionará bien.

def function(options = {}) 
    item = options[:item] 
    need_milk = options[:milk] || false 
    cow = options[:bovine] 
end 

function(:item => "Something") 

En el caso anterior, item == "Something", need_milk == false y cow == nil.

extract_options es simplemente una adición a la clase Array y Hash a través de Rails.

def function(something, else, *args) 
    options = args.extract_options! # returns Hash 
end 

Es útil si usted planea en tener muchos tipos diferentes de parámetros en args pero si solo deseas Hash opciones, a su manera original está muy bien.

Aquí hay un Gist del código en Rails para extract_options! Personalmente lo uso en mi código en el trabajo simplemente escribiéndolo en un archivo externo y requiriéndolo en mi proyecto.

+0

Esta es mi forma favorita de hacerlo. +1 para el '|| falso', puede detener la explosión del método si un usuario olvida algo :) – Starkers

-4

Ruby lo hace fácil, y ya lo estás haciendo bien.

Aquí es una poesía-modo (DSL-estilo mínimo) ejemplo:

def f x = {} 
    p x 
end 

f :a => :b 
{:a=>:b} 

f 
{} 

f :a => :b, :c => :d 
{:a=>:b, :c=>:d} 
Cuestiones relacionadas