在 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? }
…但当然,即使第一个编码有效,它也会继续读取每个编码的文件。
是否有一个简单的模式可以正常工作,但在找到第一次成功后不会继续读取文件?