我正在构建一个 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
我是否遗漏了一个步骤?
最佳答案
您在pig
的实现中使用了破坏性的方法slice!
,这可能会给初学者带来意想不到的结果。这与您在结果中得到 "ie"
(而不是 "pie"
)的原因有关。在成为更高级的 Ruby 用户之前,您应该远离 String
上的破坏性方法。在这里,使用 slice
代替。
这不是您遗漏的步骤。这是您使用错误方法的情况。您应该在 translate
中使用 map
而不是 each
。
但除此之外,您的translate
方法仍然不自然。返回字符串而不是数组的更自然的代码是:
def translate(str)
str.gsub(/\w+/){|s| pig(s)}
end
关于ruby - 对数组中的每个单词调用一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495256/