Estoy trabajando en aprender ruby ​​/ rails en este momento. El libro que estoy leyendo ha tenido una tendencia a omitir partes de nueva sintaxis. En particular, este bit;

person = Person.find(:first, :conditions => ["name = ?", "Mikey"])

Por lo que puedo decir, este método toma un símbolo como su primer argumento y lo que parece un hash de un elemento con una clave / valor de símbolo / matriz. ¿Es esto correcto y, de ser así, por qué de repente puedo especificar un hash sin llaves {} en este contexto?

1
Mikey Hogarth 15 nov. 2011 a las 23:37
2
Es posible que desee acercarse un paso más a la sintaxis de Active Record NEW, ahora será un poco diferente de eso como: person = Person.where('name = ?','Mokey').first -> guides.rubyonrails.org/active_record_querying.html
 – 
Mr_Nizzle
15 nov. 2011 a las 23:44
1
@Mr_Nizzle: en este caso particular: person = Person.where(:name => "Mikey").first
 – 
tokland
15 nov. 2011 a las 23:58

1 respuesta

La mejor respuesta

En los parámetros del método Ruby, cualquier par clave => valor que se coloca después de los argumentos normales, pero antes de un bloque, se agrupa en un solo hash. Así que si llamaste

my_method("hello", :something=>"yo!", :another_thing=>"bah!")

Eso significa que a my_method se le están pasando dos argumentos, una cadena ("hola") y un hash ({: algo => "yo!",: otro_ algo => "¡bah!"}).

Entre otras razones, esto evita la confusión entre llaves que indican un parámetro hash y llaves que indican un bloque. También es una forma conveniente de simular "parámetros con nombre", que de otra manera no existen en Ruby.

4
Jacob Mattison 15 nov. 2011 a las 23:53
Como nota adicional, el argumento hash de forma libre debe ser el último argumento o tendrá que ponerlo entre llaves explícitas. foo(:a => 'b') está bien, pero foo(:a => 'b', x) no lo está y debe ser foo({ :a => 'b' }, x) en su lugar. Generalmente, la mayoría de las interfaces definen el hash del argumento en último lugar por esta razón.
 – 
tadman
16 nov. 2011 a las 00:07
De hecho, eso es lo que quise transmitir con "después de argumentos normales".
 – 
Jacob Mattison
16 nov. 2011 a las 00:12