1

尝试编写一个方法,该方法将接受一个字符串并返回它的猪拉丁版本。单字版本工作正常,但是当我给它时"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

你能解释一下为什么会发生这种情况吗?

4

2 回答 2

1

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

您的代码不起作用,因为您没有修改splitskies,只是弄乱了其中每个单词的副本。

我想这就是你要找的。它基本上和你的一样,但没有if为每个前导辅音使用单独的:它只是删除所有前导辅音并将它们放在末尾,然后是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')

输出

eatay iepay
于 2013-09-08T19:27:22.247 回答
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]
于 2013-09-09T10:53:11.093 回答