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,这个 def 返回:refresh_prices。任何人都可以解释为什么它会失败吗?这是使用 private def 的糟糕方法吗?
最佳答案
这很有趣。看起来 do/end block 导致了语法错误。
如果您使用 {}
样式的 block ,它会按预期工作。
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 错误跟踪器的报告。
编辑: 我确认这是一个 Ruby 2.1 错误(请参阅 bug #9308)。它已在当前的 Ruby 版本中修复,因此将在下一个错误修复版本中提供。
现在,只需使用 {}
block 样式而不是 do/end。
关于ruby - ruby 2.1 上的私有(private) def 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029497/