-1

我正在创建一个方法(Pig Latin)并且在使用这个示例测试用例时遇到了问题: translate("eat pie") 应该返回 "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

我遇到的问题是数组枚举根本不操纵每个单词。我不知道为什么会这样。提前致谢。

4

3 回答 3

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"
于 2013-08-05T08:11:16.580 回答
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:我对猪拉丁语不太了解,但你应该从这里弄清楚。

于 2013-08-05T07:57:54.417 回答
-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
于 2013-08-05T07:58:36.237 回答