2011-03-10 31 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!版本時的隨機數據的快速標杆,雖然很明顯,你會想驗證這一點上您的實際數據和操作。

相關問題