2016-11-14 6 views
1

複数のものを検索するときにRubyにfind_allメソッドが必要なのはなぜですか?

find_allメソッドを使用して複数のものを検索するときにRubyに演算子が必要なのはなぜですか?私は:

x = [1,2,3,4,5] 

variable = x.find_all do |x| 
    x.even?||x.odd? 
end 
puts variable 

私は配列内の各番号が偶数か奇数のどちらであるかを調べることを試みています。最終的には、最終的に結果がvariableになります。あなたが順番に探したい条件を記述しようとした場合

、それは動作しません:

variable = x.find_all do |x| 
    x.even? 
    x.odd? 
end 

私は最初の例が動作し、二番目にはないことを、なぜ知って好奇心旺盛です。 2番目の方程式は、私の頭の中で、xが偶数であるかどうかを調べるために、順番にリストしていると思っています。なぜそれが動作していないのか分かりません。誰かがなぜ複数の条件を検索しようとしているときに、順番にメソッドをリストするのとは対照的に、理由や演算子を使用しなければならないのか説明できますか?

+1

すべての正の整数は奇数または偶数なので、すべての要素が最初の変数に返されます。2番目の方法では、ブロック内で最後の条件だけが関連しているため、オッズのみが返されます。 x.partition(&:even?)#=> [[2、4]、[1,3,5]] ' –

答えて

3

Rubyはメソッドまたはブロック内の最後の実行の行が返された行になります暗黙のリターンを持っています。たとえば、あなたはgroup_byを使用することができますそれはそれを維持することになるとこれを念頭に置いて

variable = a.find_all do |x| 
    x.even? 
    x.odd? 
end 

はラインx.odd?を考えるだけだろう。あなたはx.even?が真である場合には、ブロック内で実行するコードの最後の行であるとして、その後、trueが返されます。このために、この

variable = a.find_all do |x| 
    if x.even? 
    true 
    else 
    x.odd? 
    end 
end 

様またはオペレータなしでそれを行うことができます。 x.even?がfalseの場合、ブロック内で最後に実行されるコード行であるため、x.odd?が返されます。 ||を使用して複数の条件をチェックしようとすると効率的ですが、このようなこともできます。

私は配列a = ['dog', 2, 3.4, 'PIZZA', false, nil]を持っているとしましょう。すべての小文字の文字列、すべての整数、すべてのゼロ値が必要な場合を考えてみましょう。私はこれをすることができます

a.find_all do |i| 
    if i.is_a? String 
    i == i.downcase 
    elsif i.is_a? Numeric 
    i == i.to_i 
    else 
    i.nil? 
    end 
end 

これは['dog', 2, nil]を返します。

1

find_allのメソッドは、要素の一致をテストするために渡したブロックの戻り値のを使用して、コレクションの各要素を反復処理します。その後、一致する要素を持つ新しい配列を返します。

あなたはこのコードを使用する場合:

variable = x.find_all do |x| 
    x.even? 
    x.odd? 
end 

を明示的にreturn演算子を使用しない限り、ルビーでは、ブロックまたはメソッドの最後の式が返されるように、ブロックの戻り値は、x.odd?あります。 コレクションの要素を奇妙であるかどうかでグループ化する場合は、他の方法を使用する必要があります。

[1,2,3].group_by { |x| x.even? } 
=> {false=>[1, 3], true=>[2]} 
[1,2,3].group_by { |x| x.even? ? :even : :odd } 
=> {:odd=>[1, 3], :even=>[2]} 
関連する問題