在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