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中启动了它,根据“吃苹果派”示例和其他示例,它运行良好。你看到了什么问题?