2

如果 I open Core.Std,尝试使用close_out函数关闭 anout_channel会给我一个错误,因为 Core 更改了的类型签名close_out给我一个弃用错误消息。

close_out;;
- : [ `Deprecated_use_out_channel ] -> [ `Deprecated_use_out_channel ] = <fun>

第一个问题:为什么 Core deprecate close_outdeprecated 但不弃用close_out_noerr

第二个问题: Core 仍然希望我使用in_channels 和out_channels 还是更喜欢我为 IO 使用不同的 API?

第三个问题:我能找到的唯一其他 IO API 是类似read或模块write中的函数Unix,它们适用于文件描述符而不是文件句柄。在 C 中,文件描述符函数直接发出系统调用,而来自 stdio.h 的那些接收FILE *缓冲 IO。这在 Ocaml 中是否类似于 Unix 模块中的函数直接发出系统调用以及使用in_channelout_channel执行缓冲 IO 的函数?

4

2 回答 2

3

基本 IO 在Out_channel和模块中实现,它为旧的和类型In_channel定义了新的接口。由于类型相同,因此它是一个薄覆盖层,可以与任何其他库顺利互操作。out_channelin_channel

有什么关系close_out_noerr,看起来他们只是错过了它。一般来说,在使用 Core 时应该忘记 OCaml 标准库,而只使用后者提供的工具。如果你真的需要旧的标准库,你可以使用Camlmodule.

于 2014-10-31T10:40:14.670 回答
3

如果您查看Real World Ocaml的书,作者似乎广泛使用了In_channelandOut_channel模块。不再使用 Ocaml 普遍功能打开/关闭文件,而是使用 In_channel.closeandOut_channel.close功能。

问题是如果在读取文件时引发异常,程序员必须在捕获到异常时关闭打开的文件。对于打开的文件,没有等效的垃圾收集器。In_channel.with_file即使引发异常,使用也会负责正确关闭文件。

于 2014-10-31T10:52:13.313 回答