在Ruby第一值的映射,我有簡單的值的陣列(可能的編碼):功能發現通過測試
encodings = %w[ utf-8 iso-8859-1 macroman ]
我想保持從磁盤讀取一個文件,直到結果是有效的。我可以這樣做:
good = encodings.find{ |enc| IO.read(file, "r:#{enc}").valid_encoding? }
contents = IO.read(file, "r:#{good}")
...但當然這是愚蠢的,因爲它讀取文件兩次爲良好的編碼。我可以像程序風格那樣編程它:
contents = nil
encodings.each do |enc|
if (s=IO.read(file, "r:#{enc}")).valid_encoding?
contents = s
break
end
end
但我想要一個功能性解決方案。我可以在功能上這樣做:
contents = encodings.map{|e| IO.read(f, "r:#{e}")}.find{|s| s.valid_encoding? }
...但當然,即使第一個有效,每個編碼都會繼續讀取文件。
是否有一個簡單的功能模式,但在找到第一個成功後不會繼續讀取文件?
你的意思是'find'? '第一個'沒有擋住。 – sepp2k
@ sepp2k Bah,當然,我做到了。謝謝。我已編輯修復。 – Phrogz