erro de definição privada em Ruby 2.1
Pergunta
def agora retorna o nome do método.Então você pode escrever
private def foo
p "foo is private"
end
mas tive um erro com um método mais 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|
^
sem private este def retorna:refresh_prices.Alguém pode explicar por que ele falha e é uma maneira ruim de usar a definição privada?
Solução
É interessante.Parece que o bloco do/end está causando um erro de sintaxe.
Se você usar o {}
bloco de estilo, funciona conforme o esperado.
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
Acredito que possa ser considerado um bug.Vou ver se há algum relatório sobre o rastreador de bugs do Ruby.
EDITAR: Confirmo que é um bug do Ruby 2.1 (veja erro #9308).Foi corrigido na versão atual do Ruby, portanto estará disponível na próxima versão de correção de bugs.
Por enquanto, basta usar o {}
estilo de bloco em vez de fazer/fim.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow