2013-12-17 39 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 –