2012-06-12 20 views

Respuesta

42

Sí, podría escribir:

cats.each { |cat| cat.name } 

O simply:

cats.each(&:name) 

en cuenta que Enumerable#each devuelve el mismo objeto que está interactuando sobre (cats), por lo que sólo tiene sentido para usarlo si estás realizando algún tipo de efecto secundario dentro del bloque. Lo más probable es que quería obtener los nombres de gato, por lo que usaría Enumerable#map expresión en lugar:

cat_names = cats.map(&:name) 
+0

¿Qué tal si quisiera hacer algo como esto (que actualmente es un dos líneas): User.where (: email => /[email protected]/). cada do | usuario | user.destroy final – Goalie

+1

'User.where (: email => /[email protected] /). each (&: destroy)'. Aquí 'cada uno 'tiene sentido porque destruir es un efecto secundario. Pero escribiría: 'User.destroy_all (: email => /[email protected]/)' – tokland

46

Basta con retirar los saltos de línea:

cats.each do |cat| cat.name end 

Nota, hay dos estilos diferentes de codificación cuando se trata de a bloques. Un estilo de codificación dice a utilice siempredo/end de bloques que abarcan varias líneas y siempre uso {/} de bloques de una sola línea. Si sigue esa escuela, usted debe escribir

cats.each {|cat| cat.name } 

El otro estilo es siempre uso do/end para los bloques que son ejecutados principalmente por sus efectos secundarios y {/} de bloques que se ejecuta principalmente para su valor de retorno. Como each descarta el valor de retorno del bloque, solo tiene sentido pasar un bloque por sus efectos secundarios, por lo tanto, si sigue esa escuela, debe escribirlo con do/end.

Pero como @tokland menciones, la forma más idiomática sería escribir

cats.each(&:name) 
9

Otro truco que utilizo para la consola de rieles/IRB es para separar comandos con ';' p.ej.

[1,2].each do |e| ; puts e; end 
-2
for cat in cats;cat.name;end 

que debe hacerlo también.

+0

esto es muy feo, mira la respuesta aceptada. Tú deberías evitar ";" tanto como sea posible para la legibilidad del código. O al menos agregue espacios en línea saltos. También la pregunta pregunta por el "bloque un trazador de líneas" no para. –

Cuestiones relacionadas