5

次のような Ruby メソッドを作成する必要があります。

  1. 配列を反復処理し、要素の 1 つが特定の条件に一致する場合に Foo を実行します。

  2. 条件に一致する配列要素がない場合は、Bar 処理を行います。

他の言語では、ループに入る前にブール変数を設定し、Foo の場合はそれを切り替えます。その変数の値は、Bar が必要かどうかを教えてくれます。しかし、それはルビーらしくないほどエレガントではありません。誰かがより良い方法を提案できますか?

編集いくつかの本当に良い答えがありますが、私が言及すべき詳細のためにうまくいきません。Foo が行うことは、条件に一致する配列要素に対して行われます。また、多くても 1 つの要素が条件に一致することが保証されています。

4

6 に答える 6

6

一致するアイテムはありますか?はいの場合、一致するアイテムを含まない何かを行います。

if items.any? { |item| item.totally_awesome? }
  foo "we're totally awesome!"
else
  bar "not awesome :("
end

最初に一致したアイテムを取得します。存在する場合は、一致するアイテムで何かを行います。

awesome_item = items.find { |item| item.totally_awesome? }
if awesome_item
  foo "#{awesome_item.name} is totally awesome!"
else
  bar "no items are awesome :("
end

一致するすべてのアイテムをつかみます。配列に何かが含まれている場合は、一致するすべてのアイテムで何かを行います。

awesome_items = items.find_all { |item| item.totally_awesome? }
if awesome_items.any?
  foo "#{awesome_items.size} totally awesome items!"
else
  bar "no items are awesome :("
end
于 2013-01-25T02:14:06.583 に答える
5

必要なのはEnumerable#findです

元:

element = array.find { |x| x.passes_requirements? }
element ? element.foo! : bar
于 2013-01-25T03:22:22.923 に答える
5

次のようにできます。

if array.any? { |elem| elem.condition }
  foo
else
  bar
end

docから、Enumerable#any次のことを行います。

コレクションの各要素を指定されたブロックに渡します。ブロックが false または nil 以外の値を返す場合、メソッドは true を返します。

于 2013-01-25T02:13:43.407 に答える
1
idx = the_array.index { |i| conditional(i) }
if idx
  modify_object(the_array[idx])
else
  no_matches
end
于 2013-01-25T02:39:17.383 に答える
1

編集:新しい質問基準に基づいて変更されました。

found_index = nil
my_array.each_with_index.detect { |elem, i| elem.condition? && found_index = i }
if found_index.nil?
  do_not_found_case
else
  my_array[found_index] = some_conversion(elem)
end

これはそれほどきれいではありませんが、仕事は完了し、最初の一致で短絡します。

于 2013-01-25T02:14:51.987 に答える
0

質問に答えようとしたすべての人に感謝します。適切と思われる回答はありませんでしたが、Ruby のやり方 (この演習の主なポイントでした!) について考えさせられ、この回答にたどり着くことができました。

Ruby のイテレーターは単なるメソッドであるという事実を利用する必要があります。すべてのメソッドは値を返し、(奇妙なことに)有用なeach値を返します。反復が完了すると、反復していたコレクションが返されます。反復を早期に終了するために使用すると、戻ります(またはオプションの引数)。breaknil

したがって、ブールのコンテキストでは、ループ全体はtrue、それが完了しfalseた場合と抜け出した場合です。したがって

bar if array.each do |element|
  if fooable(element) then
    foo(element)
    break
  end
end
于 2013-01-31T05:10:58.590 に答える