Ruby:字符串在数组中显示为字符串

时间:2015-11-08 03:17:34

标签: arrays ruby string

我正在使用Ruby上的猪拉丁程序并且遇到了一些麻烦。 控制台显示此错误

expected: "appleay"
got: ["appleay"]
def translate(str)

alphabet = ("a".."z").to_a
vowels = ["a","e","i","o","u"]
consonants = alphabet - vowels

str.split.map do |word|
    if vowels.include?(word[0])
        word.to_str + "ay"

    elsif word[0..2].include?("qu")
        if word[0..1] == "qu"
            (word[2..-1] + "quay").join(" ")
        else
            word[3..-1] + word[0] + "quay"
        end
    elsif consonants.include?(word[0]) && consonants.include?(word[1]) && consonants.include?(word[2].to_s)
        word[3..-1] + word[0..2] + "ay"
    elsif consonants.include?(word[0]) && consonants.include?(word[1]) 
        word[2..-1] + word[0..1] + "ay"
    elsif cononants.include?(word[0])
        word[1..-1] + word[0] + "ay"

    else 
        word
    end
end
end

提前致谢!

2 个答案:

答案 0 :(得分:0)

这是因为您使用的是map。如果你阅读了文档,你可以找到:

  

返回一个新数组,其中包含每次运行块一次的结果   枚举中的元素。

由于返回类型是一个数组,因此您将获得Array作为结果而不是String(这里恰好是数组的第一个元素。)

一个简单的解决方案是始终返回Array的第一个元素。你可以通过以下方式实现这一目标:

str.split.map do |word|
    if vowels.include?(word[0])
      ....
    else
      word
    end
end.first # returning the first element of resultant array, nil if none present

答案 1 :(得分:0)

您正在使用Array#map。此方法返回一个数组。由于它是方法translate的最后一个语句,因此将隐式返回此数组。因此,当您调用该方法时,它将输出一个数组。要解决此问题,请执行

str.split.map do |word|
    if vowels.include?(word[0])
        #...
    elsif word[0..2].include?("qu")
        #...
    end
end.join(' ')

join(' ')会将每个元素合并为一个字符串,每个元素由一个空格分隔('')。这使得方法的输出成为字符串而不是数组,在解决大小超过一个元素的数组时修复问题,而不像shivam的其他答案,它只返回第一个元素。它以这种方式更具可扩展性。