Inplace枚举

时间:2011-03-10 19:05:50

标签: ruby enumerable

我在rails 3.x上使用ruby 1.8.7和ruby。我有很多像这样的行

lines = lines.map {|e| e.strip}
lines = lines.map {|e| e.upcase}
lines = lines.map {|e| sanitize_element(e)}

不是每次都为行分配新值,而是有更好的方法来处理它。我知道我可以做到

lines = lines.map {|e| sanitize_element(e.strip.upcase) }

但这不是这个问题的重点。主要的是找出是否有办法处理上述情况,而不是每次都为行赋值。

基本上我正在寻找一个优雅的解决方案,但我知道Enumerable中没有map!

lines.map! {|e| e.strip}

确保我没有错过任何红宝石功能。

4 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可以写

lines = lines.map {|e| e.strip}.map {|e| e.upcase}.map {|e| sanitize_element(e)}

流利的方式。这是你的意思吗?

答案 1 :(得分:1)

是的,使用Array#map!

lines.map! { |e| e.strip }
lines.map! { |e| e.upcase}
# ...

通常,像map这样的不可变方法与像map!这样的危险方法配对,这会导致接收器被修改。我建议不要使用这些,因为好的,功能风格的可枚举编程的一半是获得不变性(参考透明度等)的好处。但是,如果你要重新分配每个枚举,你也可以使用map!

答案 2 :(得分:1)

如果存在sanitize_element!,您可以尝试这种方式:

lines.map! do |e|
  e.strip
  e.upcase
  e.sanitize_element
end

我认为它看起来更清楚。

答案 3 :(得分:0)

有兴趣的话,请注意您可以单独留下阵列并专注于修改字符串本身。像这样:

lines.each do |e|
  e.strip!
  e.upcase!
  e.replace(e.sanitize_element)
end

在随机数据的快速基准测试中,这似乎在多个map!版本的时间内运行了大约2 / 3rds,尽管显然你想要在实际数据和操作上验证这一点。 / p>