在数组中的每个单词上调用一个方法

时间:2014-06-30 16:59:15

标签: ruby iteration each

我正在建立一个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

我缺少一步吗?

2 个答案:

答案 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