Ruby 对数组中的每个字调用方法
我正在做一个猪拉丁翻译。我能够使用以下代码为单个单词创建一个方法Ruby 对数组中的每个字调用方法,ruby,iteration,each,Ruby,Iteration,Each,我正在做一个猪拉丁翻译。我能够使用以下代码为单个单词创建一个方法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 + ar
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
实现中,这可能会对初学者造成意外的结果。这与您在结果中获得“ie”
(而不是“pie”
)的原因有关。在您成为更高级的Ruby用户之前,您应该远离String
上的破坏性方法。在这里,使用slice
这不是你错过的一步。在这种情况下,你使用了错误的方法。在translate
中,您应该使用map
而不是each
但是除此之外,你的翻译方法仍然不自然。返回字符串而不是数组的更自然的代码是:
def translate(str)
str.gsub(/\w+/){|s| pig(s)}
end
您的方法是正确的,但是您的方法translate
只是对您的单词进行迭代,而不是存储结果。map
方法存储每次迭代的结果并返回一个数组。然后,如果您将该数组与一个空格重新连接在一起,您将得到一个返回的字符串
def translate(english)
english.split(' ').map(&method(:pig)).join(' ')
end
迭代这些单词,并对每个单词调用pig(),但不存储结果。在每次迭代中,调用pig()的结果都被丢弃。尝试将项目添加到列表。.map(&method(:pig))
将是一种无点的表达方式。@sawa它没有什么?@sawa刚刚用OP的pig方法在irb中启动了它,根据“吃苹果派”示例和其他示例,它运行良好。你看到了什么问题?