显示数组的子集

时间:2013-12-17 16:50:23

标签: ruby arrays

说我想要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

如何在语法上实现第二个示例以使其正常工作?

5 个答案:

答案 0 :(得分:5)

可以将范围扩展为数组。然后你可以减去另一个数组。

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

作为旁注,除非你真的需要,否则不要使用#map。如果您不关心返回值,请使用#each

答案 1 :(得分:2)

你不想要平等,你想要包容:

puts a if vowels.include? a

此外,您正在使用map(与collect相同),它将实际返回puts语句的结果。除非您实际上需要,否则请使用each。或者找到符合条件的字母,然后使用该集合打印结果。

答案 2 :(得分:2)

使用Array#include?方法:

puts a unless vowels.include? a

来源:http://rubydoc.info/stdlib/core/1.9.2/Array#include%3F-instance_method

答案 3 :(得分:2)

你甚至可以摆脱循环。这保留了原始字母表。

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

答案 4 :(得分:1)

Enumerable#grep也可以使用:

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

或者只是

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