Arrays 返回数值0或1表示真或假的映射函数

Arrays 返回数值0或1表示真或假的映射函数,arrays,ruby,dictionary,Arrays,Ruby,Dictionary,我试图通过将字符串拆分为一个字母数组,然后将元音字母映射为1并对数组求和来计算字符串中元音的数量 def count_vowels(string) vowels = ['a','e', 'i', 'o', 'u'] return string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+) end 包括什么?零件未正确返回1或0。有什么建议说明为什么这架飞机飞不起来吗 我把它改成了这个版本,这个版本很有效,但

我试图通过将字符串拆分为一个字母数组,然后将元音字母映射为1并对数组求和来计算字符串中元音的数量

def count_vowels(string)
    vowels = ['a','e', 'i', 'o', 'u']
    return string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+)
end
包括什么?零件未正确返回1或0。有什么建议说明为什么这架飞机飞不起来吗

我把它改成了这个版本,这个版本很有效,但看起来有点愚蠢:

def count_vowels(string)
    vowels = ['a','e', 'i', 'o', 'u']
    return string.split("").map{ |n| vowels.include? n}.inject(0) do |mem,x|
        x ? mem + 1 : mem
    end
end
原因是:

string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+)
不工作是因为n?1:0作为要包含的参数进行计算和传递?而不是n。您需要在include?中添加一些括号:

你可以简单地做

def count_vowels(string)
  vowels = ['a','e', 'i', 'o', 'u']
  string.split(//).select { |x| vowels.include? x }.length
end

在这种情况下,您需要包含的论文?方法参数。所以

return string.split("").map{ |n| vowels.include?(n) }.inject(0) do |mem,x|
无论如何,您的代码可能会更好

元音=%wae i o u字符串的数组 方法中不需要返回,它是最后一条语句 string.split=>string.chars 请注意,您的方法可能是:

def count_vowels(string)
  string.count "aeiou"
end
你不需要地图


很好的解释。关于我建议的修订方法:1每个字符,而不是拆分/,2。计数而不是选择/长度和3@steenslag的建议,而不是我的1和2。我要说的是我在几乎所有涉及条件运算符的此类问题上所说的:只需使用if,它具有您期望的优先级,并且更具可读性:if元音。include?n然后1,否则0结束。当然,无论如何,添加括号是一个好主意,也是大多数风格指南推荐的。@JörgWMittag感谢你的建议,我今天开始胡乱摆弄Ruby,所以我还没有弄清楚所有的语法。我认识js的三级操作符,所以我把它带过来,做得很好。你是对的,显式关键字更容易阅读,你甚至不需要选择。string.each_char.count{| c | vouels.include?c}可以:-D
def count_vowels(string)
  string.count "aeiou"
end
def count_vowels(string)
  vowels = %w[a e i o u]
  string.chars.select{|n| vowels.include? n}.size
end