说我想要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
如何在语法上实现第二个示例以使其正常工作?
答案 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]/)