12

Ruby では、ループに次のアイテムに移動するように指示するのは簡単です

(1..10).each do |a|
  next if a.even?
  puts a
end

結果=>

1
3   
5
7
9

しかし、ループの外側から next を呼び出す必要がある場合 (例: メソッド)

def my_complex_method(item)
  next if item.even?  # this will obviously fail 
end

(1..10).each do |a|
  my_complex_method(a)
  puts a
end

私が見つけて動作する唯一の解決策は、SOの質問でthrow& like を使用することですRubyで外側のサイクルを破るにはどうすればよいですか?catch

def my_complex_method(item)
  throw(:skip) if item.even? 
end

(1..10).each do |a|
  catch(:skip) do   
    my_complex_method(a)
    puts a
  end
end

私の質問は次のとおりです。これを行うためのより優れたソリューションを誰かが持っていますか?? またはthrow/catchこれを行う唯一の方法ですか??

また、そのループの一部としてだけでなく呼び出したい場合my_complex_method(=> :skip をスローしないでください)、何らかの方法でループから呼び出されていることをメソッドに伝えることができますか?

4

3 に答える 3

0

返された値に基づいて、一部の値に対してのみアクションを実行するだけでよい場合は、my_complex_method列挙子を賢く使用できます。

(1..10).map { |a| [a, my_complex_method(a)] }.each do |a, success|
  puts a if success
end
ブロックを受け入れるメソッドを定義し、そこでの成功または失敗に基づいて、このブロックで何らかのアクションを実行できます: (1..10).each do |a| my_complex_method { |成功| next if success } end スコーピングのおかげで、catch/throw を使用せず、処理状況に基づいて next を呼び出すことができます。
于 2013-07-09T11:20:08.463 に答える