2011-12-08 35 views
1

可能重复:
How to break outer cycle in Ruby?如何跳过红宝石的外部循环?

array_1 = %W(http://www.abc.com www.xyz.com www.pqr.com) 
array_2 = %W(www.abc.com www.exmple.com) 
array_1.each do |a1| 
    array_2.each do |a2| 
    next if(a1.include?(a2)) 
    end 
puts a1 
end 

我想跳过那些出现在array_2条目。无论如何,如果条件满足,我可以跳过打印a1吗? Ruby没有像java这样的标签,我想跳过外部循环。 :(

任何帮助将是巨大的

+0

,我不认为这个问题是重复的;虽然OP确实在问如何打破外部循环,但重构似乎是一种走向。 – tokland

+0

@tokland代码片段在我的实际实现中完美工作。谢谢所有回复:) – benchwarmer

回答

4

你可以写:

array_1.each do |a1| 
    next if array_2.any? { |a2| a1.include?(a2) } 
    ... 
end 
1

你可以通过拉姆达与return声明each方法,而不是块。lambda函数会返回值,而不是封闭的方法拉姆达。

array_1 = %W(http://www.abc.com www.xyz.com www.pqr.com) 
array_2 = %W(www.abc.com www.exmple.com) 
array_1.each(&lambda do |a1| 
    array_2.each do |a2| 
    return if(a1.include?(a2)) 
    end 
    puts a1 
end) 
+0

break将退出当前循环,但返回将退出一个函数。所以把它放在像Alex这样的功能中是一个很好的方法。在其他语言中,你可以使用邪恶的转到:) –

0

你可以使用while循环

这可能会实现:

busy = true 
while busy 
    array1.each do |a1| 
    array2.each do |a2| 

     busy = false 
    end 
    end 
end 
1

,而不是试图模仿其他语言,你可以做这样的事情,而不是:

array_1.product(array_2).each do |a1, a2| 
    next if(a1.include?(a2)) 
end 

,或者更地道:

array_1.product(array_2).reject{ |a1, a2| 
    a1.include?(a2) 
}.each{ |a1, a2| 
    # do something here 
} 
1

[编辑]误读输入。这应该会更好。任何?方法停止搜索是否找到一个匹配项。

array_1 = %W(http://www.abc.com www.xyz.com www.pqr.com) 
array_2 = %W(www.abc.com www.exmple.com) 

puts array_1.reject{|a1| array_2.any?{|a2| a1.include?(a2)} } 

但是,如果你在一个循环的打破了坚持,有catchthrow

array_1.each do |a1| 
    catch :its_in do 
    array_2.each do |a2| 
     throw :its_in if(a1.include?(a2)) 
    end 
    puts a1 
    end 
end 
+1

数组的减法是一个好主意,但看看值,OP确实需要测试包含,它们不相等。 – tokland

+0

@tokland啊是的。代码编辑 – steenslag