2013-08-05 145 views
-1

我創建了一個方法(豬拉丁),並且遇到了這個示例測試用例的問題: translate(「吃餡餅」)應該返回「eatay iepay」,但我的代碼似乎沒有做出適當的更改。數組枚舉無法正常工作?

def translate(phrase) 
    phrase = phrase.split.each do |word| 
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0]) 
     word = word + 'ay' 
    else 
     ['a', 'e', 'i', 'o', 'u'].include?(word[1])? 
     word = word[1..-1] + word[0] + 'ay' : word = word[2..-1] + word[0..1] + 'ay' 
    end 
    end 
    phrase.join(' ') 
end 

我遇到的問題是數組枚舉不能操縱每個單詞。我對此感到茫然。提前致謝。

+0

除非你的意思'elsif'你不能在你的'else'語句的條件。 – squiguy

回答

2

each方法簡單地爲列表中的每個元素執行塊。修改控制變量word不會影響列表的原始元素。

我建議你使用map方法,它將一個列表轉換爲另一個列表。它將原始列表的每個元素傳遞給塊,並用該塊返回的值替換它。

此外,你應該只有使用條件運算符a ? b : d返回一個值 - 你不應該修改任何變量。所以你可以寫

word = ['a', 'e', 'i', 'o', 'u'].include?(word[1]) ? 
    word[1..-1] + word[0] + 'ay' : 
    word[2..-1] + word[0..1] + 'ay' 

但是這裏最好只使用一個額外的elsif子句。

此代碼做你想要的。

def translate(phrase) 

    phrase = phrase.split.map do |word| 
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0]) 
     word + 'ay' 
    elsif ['a', 'e', 'i', 'o', 'u'].include?(word[1]) 
     word[1..-1] + word[0] + 'ay' 
    else 
     word[2..-1] + word[0..1] + 'ay' 
    end 
    end 

    phrase.join(' ') 
end 

p translate "eat pie" 

輸出

"eatay iepay" 

更新

這是使用正則表達式更好寫。你可能有興趣在這個變

def translate(phrase) 
    phrase.split.map { |word| word.sub /^([^aeiou]*)(.+)/, '\2\1ay' }.join ' ' 
end 

p translate 'pig latin' 

輸出

"igpay atinlay" 
1

我認爲您正在尋找collect(或map)而不是each以上。所以,你的代碼將是:

def translate(phrase) 
    phrase = phrase.split.collect do |word| 
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0]) 
     word + 'ay' 
    else 
     if ['a', 'e', 'i', 'o', 'u'].include?(word[1]) 
     word[1..-1] + word[0] + 'ay' 
     else 
     word[2..-1] + word[0..1] + 'ay' 
     end 
    end 
    end 
    phrase.join(' ') 
end 

PS:我不太瞭解不多的Pig Latin,但你應該從這裏找到答案。

-2

您無法操作正在運行的word。而是使用each_with_index操縱數組:

def translate(phrase) 
    phrase_array = phrase.split 
    phrase_array.each_with_index do |word, i| 
    if ['a', 'e', 'i', 'o', 'u'].include?(word[0]) 
     phrase_array[i] = word + 'ay' 
    else 
     ['a', 'e', 'i', 'o', 'u'].include?(word[1])? 
     phrase_array[i] = word[1..-1] + word[0] + 'ay' : word = word[2..-1] + word[0..1] + 'ay' 
    end 
    end 
    phrase.join(' ') 
end