【问题标题】:Calling a method on every word in an array对数组中的每个单词调用方法
【发布时间】:2014-06-30 16:59:15
【问题描述】:

我正在构建一个 Pig 拉丁语翻译器。我能够使用以下代码为单个单词创建一个方法 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(),但您没有存储结果。在每次迭代中,调用 pig() 的结果都会被丢弃。尝试将项目添加到列表中。

标签: ruby iteration each


【解决方案1】:

您在实现pig 时使用了破坏性方法slice!,这可能会给初学者带来意想不到的结果。这与您在结果中得到"ie"(而不是"pie")的原因有关。在您成为更高级的 Ruby 用户之前,您应该远离String 上的破坏性方法。在这里,请改用slice

这不是您缺少的步骤。这是您使用错误方法的情况。您应该在translate 中使用map 而不是each

但除此之外,您的translate 方法仍然不自然。一个更自然的代码,它返回一个字符串而不是一个数组,将是:

def translate(str)
  str.gsub(/\w+/){|s| pig(s)}
end

【讨论】:

    【解决方案2】:

    您在正确的轨道上,但您的方法 translate 只是在迭代您的单词而不是存储结果。 map 方法存储每次迭代的结果并返回一个数组。如果你然后将该数组与一个空格重新连接在一起,你将得到一个返回的猪拉丁字符串。

    def translate(english)
      english.split(' ').map(&method(:pig)).join(' ')
    end
    

    【讨论】:

    • .map(&method(:pig)) 将是表达这一点的一种无点方式。
    • @sawa 它不是什么?
    • @sawa 刚刚使用 OP 的 pig 方法在 irb 中启动它,并且按照“吃苹果派”示例和其他示例运行良好。你看到了什么问题?
    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多