error de definición privada en Ruby 2.1
Pregunta
def ahora devuelve el nombre del método.Entonces puedes escribir
private def foo
p "foo is private"
end
pero tuve un error con un método más difícil:
2.1.1p2 :036 > private def refresh_prices
2.1.1p2 :037?> orders = order_items.includes(:book)
2.1.1p2 :038?> sum = 0
2.1.1p2 :039?> orders.each do |t|
2.1.1p2 :040 > t.price = t.book.price
2.1.1p2 :041?> sum += t.price * t.quantity
2.1.1p2 :042?> t.save
2.1.1p2 :043?> end
2.1.1p2 :044?> self.total_price = sum
2.1.1p2 :045?> save
2.1.1p2 :046?> end
SyntaxError: (irb):39: syntax error, unexpected keyword_do_block, expecting keyword_end
orders.each do |t|
^
sin privado, esta definición devuelve:refresh_prices.¿Alguien puede explicar por qué falla y si es una mala forma de utilizar la defensa privada?
Solución
Es interesante.Parece que el bloque do/end está provocando un error de sintaxis.
Si usas el {}
-bloque de estilo, funciona como se esperaba.
private def refresh_prices
orders = order_items.includes(:book)
sum = 0
orders.each { |t|
t.price = t.book.price
sum += t.price * t.quantity
t.save
}
self.total_price = sum
save
end
# => Object
Creo que podría considerarse un error.Veré si hay algún informe sobre el rastreador de errores de Ruby.
EDITAR: Confirmo que es un error de Ruby 2.1 (ver error #9308).Se ha solucionado en la versión actual de Ruby, por lo que estará disponible en la próxima versión de corrección de errores.
Por ahora, simplemente use el {}
estilo de bloque en lugar de hacer/finalizar.