2010-03-17 11 views
18

¿Cómo puedo declarar un método con argumentos de palabra clave al igual que lo hacen los carriles. algunos ejemplos pueden serargumentos clave de rubí método

Person.find(:all, :conditions => "..."). 

¿Cómo puedo usar símbolos para crear métodos similares a los anteriores?

Soy muy nuevo al rubí. ¡Gracias por adelantado!

+0

Son no argumentos de palabra clave. En su lugar, puede ver el código fuente de los métodos que toman estos argumentos para descubrir cómo implementar esta técnica. Eche un vistazo a la documentación de 'ActiveRecord :: Base.find' (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263) para obtener ideas. – yfeldblum

Respuesta

37

Ruby no tiene realmente argumentos de palabra clave. Raíles está explotando una característica de rubí que le permite omitir las llaves alrededor de un hash. Por ejemplo, con find, lo que realmente estamos pidiendo es:

Pero si el hash es el último argumento del método, se puede dejar de lado los apoyos y todavía será tratado como un hash:

Person.find(:all, :conditions => "...", :offset => 10, :limit => 10) 

Usted puede utilizar esto en sus propios métodos:

def explode(options={}) 
    defaults = { :message => "Kabloooie!", :timer => 10, :count => 1 } 
    options = defaults.merge(options) 

    options[:count].times do 
     sleep options[:timer] 
     puts options[:message] 
    end 
end 

Y luego llamarlo:

explode :message => "Meh.", :count => 3 

O llame sin un argumento, lo que resulta en todos los valores por defecto que se utiliza:

explode 
+6

Esta respuesta está ahora (parcialmente) desactualizada. Ruby 2.0 tiene argumentos verdaderos de palabra clave. Sin embargo, son astutamente compatibles con la convención de usar hashes de último argumento: si pasas un hash con las teclas de los símbolos a un método que espera palabras clave, Ruby los mostrará en los argumentos de las palabras clave. Rails aún no usa los argumentos de palabra clave de Ruby 2.0 para mantener la compatibilidad con Ruby 1.9. – Peeja

0

Desde Rubí se escribe de forma dinámica, acaba de hacer:

def my_method(arg1, arg2) 
    #things 
end 

ejemplo:

my_method(:test, {:somehash => "yay"}) 

o

my_method :test, :somehash => "yay" 

o

my_method(:test, :somehash => "yay") 
1

Sólo tiene que definir un método en el que uno de los parámetros es un hash. En realidad es bastante simple.

def method(arg1, params) 
    name = params[:name] 
    number = params[:number] 

Y luego llamar así:

method(arg1, :name => 'Eric', :number => 2) 

Dos notas:

  1. En Ruby, que no es necesario para rodear los parámetros fritas en {} cuando se llama al método en la mayoría de los casos, a menos que tenga algo complicado pasando como pasar hashes múltiples. En ese caso, asegúrese de rodear esos parámetros con {}
  2. Ruby está tipeado dinámicamente, por lo que no necesita decir que params es un hash cuando define el método.
6

Acepto la respuesta aceptada dada por Samir Talwar y christopherwright. El único inconveniente potencial es que no recibe advertencias si utiliza un símbolo de palabra clave incorrecta como argumento o cuando busca una opción, simplemente termina ignorado. Si eso es algo que le preocupa, la gema hash_keyword_args lo aborda.El lenguaje sería

def explode(opts={}) 
    opts = opts.keyword_args(:message => "Kabloooie!", :timer => 10, :count => 1) 

    opts.count.times do 
     sleep opts.timer 
     puts opts.message 
    end 
end 

Aviso el uso de métodos de acceso de manera que obtendrá una NoMethodError si escribe mal una palabra clave. Y el comportamiento de llamada es:

explode(:message => "Okay") # works 
explode(:msg => "Oops")  # raises ArgumentError 

La gema también proporciona algunas otras características que podrían o no importan, tales como ser capaz de indicar que se requiere una palabra clave. Lo he estado usando felizmente desde hace un tiempo.

(Negación:. Soy el autor de la gema)

0

Ruby 2.0 introdujo los argumentos de la palabra clave real, y Ruby 2.1 agregó los argumentos requeridos de la palabra clave.

Hay un buen artículo para arriba en https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/ en esto, me ha pedido prestado los ejemplos de allí:

Rubí 2.0+:

def exclaim(text, exclamation: '!', number: 7) 
    text + exclamation * number 
end 

exclaim('hello', number: 4) #=> 'hello!!!!' 

# equivalent: 
exclaim('hello', {:number => 4}) #=> 'hello!!!!' 

Rubí 2.1+:

def exclaim(text, exclamation: '!', number:) 
    text + exclamation * number 
end 

exclaim('Yo', number: 5) # => 'Yo!!!!!' 
exclaim('Yo') # raises: ArgumentError: missing keyword: number 
Cuestiones relacionadas