【问题标题】:How to save the output from `each` method [duplicate]如何保存`each`方法的输出[重复]
【发布时间】:2013-09-12 05:54:22
【问题描述】:

尝试编写一个方法,该方法将接受一个字符串并返回它的猪拉丁版本。单字版本可以正常工作,但是当我给它"eat pies" 时,它会返回"eat pies" 而不是"eatay iespay"。代码如下:

def translate(string)
  x = string
  if x.split.count > 1 
    splitskies = x.split
    splitskies.each do |w|
      if w[0].match(/[aeiou]/)
        w = w + "ay"
      elsif w[0] !~ (/[aeiou]/) && w[1] !~ (/[aeiou]/)
        w = w[2..-1] + w[0..1] + "ay"
      elsif w[0] !~ (/[aeiou]/)
        w = w[1..-1] + w[0] + 'ay'
      end
    return splitskies.join(' ')
   end
  else
    if x[0].match(/[aeiou]/)
      x = x + "ay"
    elsif x[0] !~ (/[aeiou]/) && x[1] !~ (/[aeiou]/)
      x[2..-1] + x[0..1] + "ay"
    elsif x[0] !~ (/[aeiou]/)
      l = x.slice!(0)
      x = x + l + "ay"
    end
  end
end

您能否解释一下为什么会发生这种情况?

【问题讨论】:

标签: ruby arrays string iteration each


【解决方案1】:

这个问题出自哪里?我已经看过几次了。

您的代码不起作用,因为您没有修改splitskies,只是弄乱了其中每个单词的副本。

我认为这就是您要寻找的。它基本上和你的一样,但没有为每个前导辅音使用单独的if:它只是删除所有前导辅音并将它们放在最后,然后是ay。无需像join 单元素列表那样检查短语中有多少单词。

def translate(phrase)
  phrase.split.map do |word|
    word.gsub('qu', 'q') =~ /^([^aeiou]*)(.*)/
    ($2 + $1 + 'ay').gsub('q', 'qu')
  end.join ' '
end

puts pig('eat pie')

输出

eatay iepay

【讨论】:

  • 教程来自这里:testfirst.org/learn_ruby 您的代码比我的要短得多,并且适用于大多数情况,您能解释一下它是如何工作的吗?如果单词包含元音(也许我不完全理解正则表达式),那么 $2 和 $1 是什么?这最终成为我的解决方案:gist.github.com/Sp33k3rph433k/6611873
【解决方案2】:

“each”方法用于其副作用 - 它返回您传递给它的原始对象。在 IRB 中试一试:

array = [1,2,3]
array.each {|elem| elem ** 2}
p array
[1,2,3]

尝试改用“地图”。该方法将返回一个修改后的对象。

array = [1,2,3]
array.map {|elem| elem ** 2}
p array
[1,4,9]

【讨论】:

  • 这非常有帮助,我感谢您的意见。仍在开始,但地图确实可以正常工作!
猜你喜欢
  • 2011-10-31
  • 1970-01-01
  • 2011-01-20
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多