2011-07-28 20 views
8

Duplicar posible:
Ruby block and unparenthesized argumentsRubí Bloque Error de sintaxis

no estoy seguro de entender este error de sintaxis. Estoy usando Carrierwave para administrar algunas cargas de archivos en una aplicación de Rails, y parece que estoy pasando un bloque a uno de los métodos incorrectamente.

Aquí está el ejemplo en el Carrierwave Docs:

version :thumb do 
    process :resize_to_fill => [200,200] 
end 

Aquí es lo que tenía:

version :full { process(:resize_to_limit => [960, 960]) } 
version :half { process(:resize_to_limit => [470, 470]) } 
version :third { process(:resize_to_limit => [306, 306]) } 
version :fourth { process(:resize_to_limit => [176, 176]) } 

Lo anterior no funciona, me sale syntax error, unexpected '}', expecting keyword_end. Curiosamente, las siguientes obras: perfectamente

version :full do process :resize_to_limit => [960, 960]; end 
version :half do process :resize_to_limit => [470, 470]; end 
version :third do process :resize_to_limit => [306, 306]; end 
version :fourth do process :resize_to_limit => [176, 176]; end 

lo tanto, mi pregunta es, ¿por qué puedo pasar a un bloque mediante do...end pero no apoyos en este caso?

Gracias!

+0

Este es un duplicado de [bloque de código pasado a 'each' trabaja con soportes pero no con' do' -'end' (ruby)] (http://StackOverflow.Com/q/6718340/), [Definición de bloque - ¿diferencia entre llaves y 'do' -'end'?] (http://StackOverflow.Com/q/6179442 /), [Ruby multiline block sin 'do'' end'] (http://StackOverflow.Com/q/3680097/), [Usando 'do' block vs brackets' {} '] (http: // StackOverflow.Com/q/2122380/), [¿Cuál es la diferencia o el valor de estos estilos de codificación de bloque en Ruby?] (Http://StackOverflow.Com/q/533008/) y [Ruby block y argumentos sin apariencia] (http : //StackOverflow.Com/q/420147/). –

Respuesta

14

Prueba esto:

version(:full) { process(:resize_to_limit => [960, 960]) } 
version(:half) { process(:resize_to_limit => [470, 470]) } 
version(:third) { process(:resize_to_limit => [306, 306]) } 
version(:fourth) { process(:resize_to_limit => [176, 176]) } 

tiene un problema precedencia. El bloque { } se ata con más fuerza que un bloque do...end y es más ajustado que una llamada a un método; el resultado es que Ruby cree que intentas proporcionar un bloque como argumento para un símbolo y dice que no.

Se puede ver un claro ejemplo, o posiblemente más familiarizados mediante la comparación de los siguientes (?):

[1, 2, 3].inject 0 { |x, y| x + y } 
[1, 2, 3].inject(0) { |x, y| x + y } 
+0

Eso es exactamente. ¡Gracias por la rápida explicación! – Andrew