ошибка private def в ruby 2.1
Вопрос
def теперь возвращает имя метода.Так что вы можете писать
private def foo
p "foo is private"
end
но у меня была ошибка с более сложным методом:
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|
^
без private этот параметр возвращает :refresh_prices.Кто-нибудь может объяснить, почему это не удается и является ли это плохим способом использования private def?
Решение
Это интересно.Похоже, что блок do/end вызывает синтаксическую ошибку.
Если вы используете {}
-блок стиля, он работает так, как ожидалось.
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
Я полагаю, что это можно было бы считать ошибкой.Я посмотрю, есть ли какой-нибудь отчет на Ruby bug tracker.
РЕДАКТИРОВАТЬ: Я подтверждаю, что это ошибка в Ruby 2.1 (см. ошибка #9308).Это было исправлено в текущей версии Ruby, таким образом, оно будет доступно в следующем выпуске с исправлением ошибок.
На данный момент просто используйте {}
стиль блока вместо do/end.