尝试编写一个方法,该方法将接受一个字符串并返回它的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
你能解释为什么会这样吗?
答案 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]