【问题标题】:Skipping iteration from Proc从 Proc 跳过迭代
【发布时间】:2015-06-20 16:54:54
【问题描述】:

我想知道是否可以使用 Proc 在 Ruby 中跳过迭代?

我写了一段代码

def validation i
  pr = Proc.new do |i|
    if i < 3
      next
    end
  end
  pr.call(i)
end

(1..5).each do |i|
  validation i
  puts "#{i} is bigger than 3"
end

我期望结果是这样的:

3 is bigger than 3
4 is bigger than 3
5 is bigger than 3

但我得到了:

1 is bigger than 3
2 is bigger than 3
3 is bigger than 3
4 is bigger than 3
5 is bigger than 3

那么是否可以在Proc 中以某种方式使用next 来跳过外部迭代或有其他方式?

【问题讨论】:

    标签: ruby iteration metaprogramming next proc


    【解决方案1】:

    您不能在validation 方法中调用next,因为循环是外部的。您可以做的是在您的(1..5).each 循环中使用next,这取决于对validation 的调用。以下代码会产生您想要的结果。

    编辑 - 代码已被重构以适当使用Proc

    pr = Proc.new {|i| i < 3}
    
    (1..5).each do |i|
      next if pr.call(i)
      puts "#{i} is bigger than 3"
    end
    

    【讨论】:

    • 每次调用validation 时创建一个新的Proc 有意义吗?您可以单独定义它@pr = Proc...。同样validatei &gt;= 3 时返回nil,这没问题,但是对于proc(因此validate)只返回i&lt;3(即true 或@987654337)不是更有意义@?
    • @Cary 你说得非常正确。我的代码(和原始代码)没有通过反复实例化pr 来很好地(或实际上)使用Proc 函数。正如您所指出的,将它移到函数之外会更合适。请查看我的编辑,我还包含了 i &lt; 3 重构。
    • 我认为从 Proc 调用 next 是不可能的,在这种情况下使用 Proc 完全没有意义。最好用普通方法替换validation Proc。
    猜你喜欢
    • 2011-08-06
    • 2011-06-28
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2013-10-03
    • 2015-05-24
    相关资源
    最近更新 更多