数组枚举不能正常工作?

时间:2013-08-05 07:50:25

标签: ruby

我正在创建一个方法(猪拉丁语),并且我遇到了这个示例测试用例的问题: 翻译(“吃馅饼”)应该返回“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

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

3 个答案:

答案 0 :(得分: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 :(得分: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:我对猪拉丁语知之甚少,但你应该从这里弄明白。

答案 2 :(得分:-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