如何保存`each`方法的输出

时间:2013-09-08 17:14:26

标签: ruby arrays string iteration each

尝试编写一个方法,该方法将接受一个字符串并返回它的pig-latin版本。单字版本工作正常,但是当我给它"eat pies"时,它会返回"eat pies"而不是"eatay iespay"。这是代码:

def translate(string)
  x = string
  if x.split.count > 1 
    splitskies = x.split
    splitskies.each do |w|
      if w[0].match(/[aeiou]/)
        w = w + "ay"
      elsif w[0] !~ (/[aeiou]/) && w[1] !~ (/[aeiou]/)
        w = w[2..-1] + w[0..1] + "ay"
      elsif w[0] !~ (/[aeiou]/)
        w = w[1..-1] + w[0] + 'ay'
      end
    return splitskies.join(' ')
   end
  else
    if x[0].match(/[aeiou]/)
      x = x + "ay"
    elsif x[0] !~ (/[aeiou]/) && x[1] !~ (/[aeiou]/)
      x[2..-1] + x[0..1] + "ay"
    elsif x[0] !~ (/[aeiou]/)
      l = x.slice!(0)
      x = x + l + "ay"
    end
  end
end

你能解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

这个问题来自哪里?我已经看过几次了。

您的代码无效,因为您没有修改splitskies,只是弄乱了每个单词的副本。

我认为这就是你要找的东西。它基本上与你的相同,但不为每个主要辅音使用单独的if:它只删除所有主要辅音并将它们放在最后,然后是{{1 }}。没有必要检查短语中有多少单词,因为你可以ay单个元素列表就好了。

join

<强>输出

def translate(phrase)
  phrase.split.map do |word|
    word.gsub('qu', 'q') =~ /^([^aeiou]*)(.*)/
    ($2 + $1 + 'ay').gsub('q', 'qu')
  end.join ' '
end

puts pig('eat pie')

答案 1 :(得分:1)

“each”方法用于其副作用 - 它返回传递给它的原始对象。在IRB中尝试:

array = [1,2,3]
array.each {|elem| elem ** 2}
p array
[1,2,3]

请尝试使用“地图”。该方法将返回一个修改过的对象。

array = [1,2,3]
array.map {|elem| elem ** 2}
p array
[1,4,9]