我在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}
确保我没有错过任何红宝石功能。
答案 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>