2013-12-17 3 views
1

Скажем, я хочу puts алфавит. Так что я могу сделать что-то вроде:Подмножество подмножества массива

alphabet = ('a'..'z') 
alphabet.map do |a| 
    puts a 
end 

То, что я хочу сделать сейчас, это исключает vowels.

alphabet = ('a'..'z') 
vowels = ['a','e','i','o','u'] 
alphabet.map do |a| 
    puts a unless a == vowels 
end 

Я пытаюсь избежать этого:

alphabet = ('a'..'z') 
alphabet.map do |a| 
    puts a unless a == 'a' 
    puts a unless a == 'e' 
    puts a unless a == 'i' 
    puts a unless a == 'o' 
    puts a unless a == 'u' 
end 

Как синтаксически реализовать второй пример так, что он работает должным образом?

+2

Это не рефакторинга, это изменение функциональности. –

ответ

5

Диапазон может быть расширен в массив. Затем вы можете вычесть другой массив.

chars = ('a'..'z').to_a - %w(a e i o u) 
chars.each do |a| 
    puts a 
end 

В качестве примечания, не используйте #map, если вам действительно не нужно. Используйте #each, если вы не заботитесь о возвращаемом значении.

+0

+1, это лучше, если вам не нужно ничего делать с остальной частью алфавита. –

+0

Определенно +1. Это уменьшает повторяющиеся вызовы в Array # include? –

2

Вы не хотите равенства, вы хотите включение:

puts a if vowels.include? a 

Кроме того, вы используете map (такой же, как collect), который фактически возвращает результаты puts отчетности. Если вы на самом деле необходимо это, используйте each. Или найдите буквы, соответствующие условию, и используйте эту коллекцию для печати результатов позже.

2

Вы можете даже избавиться от петли. Это сохраняет исходный алфавит.

alphabet = ('a'..'z') 
puts (alphabet.to_a - %w(a e i o u)).join('\r') 
1

Enumerable#grep будет работать, тоже:

('a'..'z').grep(/[^aeiou]/) { |a| puts a } 

Или просто

puts ('a'..'z').grep(/[^aeiou]/) 
+0

Я бы пошел с этим ... Удивительно .. +1 –

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