2015-11-08 104 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