2011-03-10 51 views
0

我使用红宝石1.8.7和红宝石的轨道3.x。我有很多行这样Inplace enumeration

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} 

只要确保我不错过一个红宝石功能。

回答

1

是,通过Array#map!

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

通常,像map一个不可变的方法是搭配一个危险的一个像map!,这将导致接收器进行修改。我建议不要使用这些,因为好的函数式可枚举编程的一半是获得不变性(参考透明性等)的好处。但是,如果您要重新分配每个枚举,那么最好使用map!

+0

地图!未在http://www.ruby-doc.org/core/classes/Enumerable.html#M001491列出。让我试试看。 – 2011-03-10 19:13:12

+1

是的,它实际上是在'Array'上。 http://www.ruby-doc.org/core/classes/Array.html#M000250;我认为这样做的原因是'Enumerable'只指定了不变的做事方式。 – 2011-03-10 19:14:33

+1

很酷。非常感谢。 – 2011-03-10 19:18:34

1

如果我正确理解你的问题,你可以在一个时尚流畅写

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

。这是你的意思吗?

+0

这一切都是动态完成的,所以我不能这样做。 – 2011-03-10 19:11:26

+0

@Nadal:你是什么意思? – 2011-03-10 22:15:20

1

在情况下,如果存在sanitize_element!你可以试试这个方法:

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

我认为它看起来更清晰。

0

感兴趣的是,请注意,您可以单独放置数组,并专注于修改字符串本身。就像这样:

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

在这个看起来似乎在约2 /三分之二跑的多重map!版本时的随机数据的快速标杆,虽然很明显,你会想验证这一点上您的实际数据和操作。

相关问题