ruby - ruby 2.1 上的私有(private) def 错误

标签 ruby 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,这个 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/

相关文章:

ruby-on-rails - 使用 bcrypt 生成的 Rails 密码是可移植的吗?

ruby-on-rails - 在 Ruby on Rails 应用程序中设置 json max_nesting 选项

ruby-on-rails - RoR - 哪个是首选 - 机架中间件或主动 Controller 过滤器?

ruby-on-rails - Ruby 2.1.0/2.1.1/2.1.2 不支持调试器 gem

ruby-on-rails - Rails 递归 View 与对象关联的奇怪行为

ruby - 为什么关键字参数必须作为带有符号键的散列传递,而不是 Ruby 中的字符串键?

ruby - 在 windows 上 rake : bad interpreter: permission denied

ruby - rake "variadic"任务

ruby-on-rails - 与 Ruby 2.0 或 1.9 相比,Ruby 2.1 的内存使用量增加

Ruby 组合两个数组导致进程耗尽内存