2015-11-08 109 views
2

我正在研究Ruby上的拉丁程序,并且遇到了一些麻烦。 控制台显示此错误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

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

返回与枚举每 元素运行一次块的结果的新阵列。

由于返回类型为数组,你得到数组作为结果,而不是一个字符串(这里正好是数组的第一个元素。)

一个简单的解决方案将是始终返回数组的第一个元素。

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 
+0

感谢您的帮助:) –

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的其他答案不同,后者只会返回第一个元素。这种方式更具可扩展性。

+0

Thankee!帮助很多 –

+0

@HyungkiPark然后将其标记为答案,请:) – Charles