2016-07-05 3 views
1

Я пытаюсь использовать keep_if в моем приложении Rails 5 с Ruby 2.3.1.Как использовать 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() удаляет каждый элемент из self, для которого блок оценивается в false. См. 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', что неверно. –

Смежные вопросы