gpt4 book ai didi

io - 在 F# 中正确处理流

转载 作者:行者123 更新时间:2023-11-30 23:48:44 24 4
gpt4 key购买 nike

以下代码在读取文件时抛出 ObjectDisposedException。在枚举整个序列之前,BinaryReader 似乎超出了范围。在不泄漏读者的情况下安全地进行此调用的正确方法是什么?我宁愿不必在顶级代码中进行流管理——理想情况下,它是隐藏在给定文件路径的地方。

在此代码中,Edge.ReadBinary 执行从二进制流中反序列化 Edge 的明显任务。在我的代码中,该文件夹做了一些更复杂的事情,但为了便于阅读,我在这里对其进行了简化。

let rec readEdges (br:BinaryReader) =
seq {
match Edge.ReadBinary br with
| None -> yield! Seq.empty
| Some(e) -> yield e; yield! readEdges br
}

let readBinaryEdges fn =
use br=new BinaryReader(File.OpenRead(fn))
readEdges br

let sampled=readBinaryEdges fn |> Seq.fold (fun result l -> l::result) list.Empty

最佳答案

正如 iljdarn 的评论中所指出的,将 use 放在序列表达式中可以解决这个问题。这是可行的,因为序列表达式构建器为 use 关键字定义了自己的语义,以支持在适当的时间进行处置。因此,如果您将函数更改为

let readBinaryEdges fn =
seq { use br = new BinaryReader(File.OpenRead(fn))
yield! readEdges br }

读者将处理序列。

关于io - 在 F# 中正确处理流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28376776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com