2016-07-05 7 views
1

Ruby 2.3.1を使用しているRails 5アプリケーションでkeep_ifを使用しようとしています。文字列配列でkeep_ifを使用する方法

a = ["a", "b", "c", "d" ] 
b = ["b", "d"] 

a.keep_if { |v| v=~ /["#{b}"]/ } 
#=> ["b", "d"] 

実際のプロジェクト:私は期待したもの

a = ["apple", "banana", "orange"] 
b = ["mangoes", "banana", "pear"] 

a.keep_if { |v| v=~ /["#{b}"]/ } 
#=> ["mangoes", "banana", "pear"] 

#=> ["banana"] 

私は、使用する正規表現のいくつかの並べ替えを推測していますか?私が期待したものを得る方法?

+2

'a.keep_if {| v | b.include?(v)} '? –

+1

Egad!なぜ答えを選択する急いで??? –

+4

あなたのコードがうまくいかなかった理由を理解するには、これが実際に何をするかを考えてください: '/ ["#{b} "] /'。文字列補間( '#{...}')を使うと、Rubyは値に対して 'to_s'を呼び出し、その結果を文字列に入れます。この場合の 'b.to_s'は' ["b"、 "d"] 'を返します。最後の正規表現は'/["[" b "、" d "]"]/'です。正規表現がこのコードをデバッグするための最初のステップであることを確認してください。 –

答えて

1

keep_if()は、ブロックがfalseと評価されるselfのすべての要素を削除します。 Array#select!

ブロックが指定されていない場合は、代わりに列挙子が返されます。

@Cary Swovelandは、あなたが使用したい場合は、以下が動作する必要があることをcommentで述べたkeep_if()

a.keep_if { |v| b.include?(v) } #=> ["banana"] 

あなたはおそらく別のシナリオのための代わりにArray#select!を使用したい場合は動作します以下:

c = a+b 
c.select { |x| c.count(x) == 2 }.uniq #=> ["banana"] 
# (use .uniq > 2 for values that appear more than once) 
+0

よろしいですか?私は本当に 'keep_if'が動作すると思っていました。ありがとう。 – Sylar

+1

あなたの#2に関しては、 'a = [1,2,1]'と 'b = [2]'ならどうなりますか? –

+1

あなたの最初の例では、あなたの正規表現に変換される配列 'b'は何ですか?そして、変換は何ですか? 'a '= [' ab '、' cd ''、 'b = [' a '、' e '、' i '、' o '、' u ']' b' = ['aeiou'] 'どちらも 'ab'が' a'に保持されている(選択されている)ので、正しく動作しません。 –

関連する問題