ruby - 对数组中的每个单词调用一个方法

标签 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

我是否遗漏了一个步骤?

最佳答案

您在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/

相关文章:

jQuery every - 将 (this) 与类规范相结合

javascript - 在不同对象上显示每个循环结果时遇到问题

Javascript 循环和迭代

arrays - 在haskell中迭代数组

jquery - 从我的函数中删除 HTML

ruby-on-rails - 回形针不会在 Rails 应用程序中保存图像

iteration - SICP - 我对阶乘迭代过程的递归定义不好吗?

ruby-on-rails - rails Assets 管道 "Cannot allocate memory - nodejs"

ruby-on-rails - 未 checkout ... bundle install 不修复帮助!

ruby-on-rails - 如何解析 Wufoo 表单 webhook 哈希以获取表单标签和值?