我正在使用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
提前致谢!
答案 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的其他答案,它只返回第一个元素。它以这种方式更具可扩展性。