【问题标题】:What is invalid next in Ruby?Ruby 中的下一步是什么?
【发布时间】:2013-11-02 12:33:27
【问题描述】:

以下代码有效:

collection.each do |i|
  begin
    next if i > 10
    i += 1
  rescue
    puts "could not process #{ i }"
  end
end

但是,当我们重构时:

collection.each do |i|
  begin
    increment i
  rescue
    puts "could not process #{ i }"
  end
end

def increment i
  next if i > 10
  i += 1
end

我收到invalid next 错误。这是 Ruby (1.9.3) 的限制吗?

如果增量方法出现异常,begin rescue 块的工作方式是否相同?

【问题讨论】:

  • 我的问题是他希望next 做什么?
  • 是的,这是一个简化的例子。如果我发布生产代码,它会掩盖问题。
  • 这不是一个“限制”,而是一个设计决定,而且是一个好的决定。您不应该能够将next 移出循环上下文。你也不能用任何其他语言。
  • 除了您试图从方法调用更改循环流这一事实之外,方法increment 内的i 的范围是该方法的本地范围。所以它变成了一个不同于循环中的i。不仅next 不能那样工作,i 的增量也不能那样工作。

标签: ruby iterator enumerable


【解决方案1】:

您的next 语句必须出现在循环内。 increment 方法中没有循环。

异常会“冒泡”,因此如果您的 increment 方法中有异常,它将被调用方法的 rescue 部分捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多