如果我open Core.Std
,尝试使用close_out
函数关闭out_channel
会给我一个错误,因为Core会更改close_out
的类型签名以给我一个弃用错误消息。
close_out;;
- : [ `Deprecated_use_out_channel ] -> [ `Deprecated_use_out_channel ] = <fun>
第一个问题:为什么Core弃用close_out
已弃用但未弃用close_out_noerr
?
第二个问题: Core是否仍然希望我使用in_channel
和out_channel
,还是更喜欢我使用不同的API进行IO?
第三个问题:我能找到的唯一其他IO API是read
模块中的write
或Unix
等函数,它们代替文件描述符文件句柄。在C中,文件描述符函数直接发出syscalls,而接收FILE *
的stdio.h中的函数执行缓冲IO。这与Ocaml中的类似,Unix模块中的函数直接发出系统调用,而使用in_channel
和out_channel
的函数是否会缓冲IO?
答案 0 :(得分:3)
基本IO在Out_channel
和In_channel
模块中实现,它们定义了旧out_channel
和in_channel
类型的新接口。由于类型相同,因此它是一个薄的覆盖层,可以与任何其他库平滑地互操作。
关于close_out_noerr
,看起来他们只是错过了它。在genral中,使用Core时应该忘记OCaml标准库,并且只使用后者提供的工具。如果您确实需要旧标准库,可以使用Caml
模块。
答案 1 :(得分:3)
如果你看一下Real World Ocaml书,
作者似乎广泛使用In_channel
和Out_channel
模块。
使用Ocaml普及函数不再打开/关闭文件,而是使用
In_channel.close
和Out_channel.close
函数。
问题是如果在读取文件时引发异常,程序员必须在捕获到异常时关闭打开的文件。打开的文件没有垃圾收集器的等价物。使用In_channel.with_file
可以处理正确的文件关闭,即使引发了异常。