2014-01-09 1 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| 
       ^

반품 정의 : 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 

나는 이것이 버그라고 생각 될 수 있다고 생각합니다. 루비 버그 추적기에 대한 보고서가 있는지 확인할 수 있습니다.


편집 : 나는 그것이 루비 2.1 버그 확인 (bug #9308 참조). 현재 Ruby 버전에서 수정되었으므로 다음 버그 수정 릴리스에서 사용할 수 있습니다.

지금은 do/end 대신 {} 블록 스타일을 사용하십시오.

+0

제기 할 경우 버그 보고서 번호도 여기에 적어주세요. –

+1

발견되고 게시되었습니다. –

+0

@imone .. 고마워 .. –