Вопрос

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top