2014-01-09 42 views
3

def現在返回方法名稱。所以,你可以寫關於ruby的私人def錯誤2.1

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| 
       ^

沒有私人此返回def:refresh_prices。任何人都可以解釋爲什麼它失敗了,這是使用私人def的壞方法嗎?

回答

3

這很有趣。看起來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跟蹤器的報告。


編輯:我確認這是一個Ruby 2.1的bug(見bug #9308)。它已在當前的Ruby版本中修復,因此它將在下一個bug修復版本中提供。

現在,只需使用{}塊樣式代替do/end。

+0

請在這裏提及錯誤報告編號,如果你提高它... –

+1

發現併發布。 –

+0

@simone ..謝謝.. –