我正在建立一个Pig Latin翻译器。我能够使用以下代码为单个单词创建方法pig
:
def pig(str)
vowels = ['a', 'e', 'i', 'o', 'u']
arr = str.split(//)
if vowels.include? arr[0]
result = str + 'ay'
else
str.slice!(0)
if ! vowels.include? arr[1]
str.slice!(0)
result = str + arr[0] + arr[1] + 'ay'
else
result = str + arr[0] + 'ay'
end
end
result
end
的功能如下:
pig('eat') # => eatay
pig('apple') # => appleay
pig('pie') # => iepay
我正在尝试编写另一个方法translate
,因此我可以输入多个单词的字符串,并在字符串中的每个单词上调用pig
方法。这是我试过的:
def translate(str2)
words = str2.split(' ')
words.each do |x|
pig(x)
end
end
我使用此示例代码来测试结果:
puts translate('eat apple pie')
虽然每个单词都已成功翻译,但translate
方法已返回:
eat
apple
ie
虽然我预计会回来:
eatay
appleay
iepay
我缺少一步吗?
答案 0 :(得分:2)
您在slice!
的实施中使用了破坏性方法pig
,这可能会给初学者带来意想不到的结果。这与您在结果中获得"ie"
(而不是"pie"
)的原因有关。在成为更高级的Ruby用户之前,您应该远离String
上的破坏性方法。在这里,请改用slice
。
这不是你缺少的一步。您使用的方法是错误的。您应该在map
中使用each
代替translate
。
但除此之外,您的translate
方法仍然不自然。返回字符串而不是数组的更自然的代码是:
def translate(str)
str.gsub(/\w+/){|s| pig(s)}
end
答案 1 :(得分:1)
您正走在正确的轨道上,但您的方法translate
只是迭代您的单词而不是存储结果。 map
方法存储每次迭代的结果并返回一个数组。如果你再将这个数组与一个空格连在一起,那么你将得到一个返回的猪拉丁字符串。
def translate(english)
english.split(' ').map(&method(:pig)).join(' ')
end