2014-10-30 45 views
2

如果我open Core.Std,試圖使用close_out函數關閉out_channel會給我一個錯誤,因爲Core更改類型簽名close_out給我一個棄用錯誤消息。爲什麼Core.Std棄用`close_in`和`close_out`函數?

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

第一個問題:爲什麼核心棄用close_out棄用而不是close_out_noerr

第二個問題:是否仍核心指望我用in_channel S和out_channel的工作還是不喜歡它,我使用的IO不同的API?

第三個問題:唯一的其他IO API,我可以看到的是像Unix模塊readwrite功能,這對文件描述符,而不是文件句柄工作。在C中,文件描述符函數直接發出系統調用,而來自stdio.h的接收FILE *的函數執行緩衝IO。這在Ocaml中是否類似於Unix模塊中的函數直接發出系統調用,而使用in_channelout_channel的函數可以緩衝IO?

+0

似乎有2個函數可以對應你需要的:'Core.In_channel.close'和'Core.Out_channel.close'。你嘗試過這些嗎? (我不是核心用戶,也許這些函數只是別名)我似乎還記得,首選的方法是使用這些模塊中的'with_file'函數,因爲它們負責在之後關閉文件。 – didierc 2014-10-31 07:19:04

回答

3

如果你看看Real World Ocaml這本書, 作者似乎廣泛使用In_channelOut_channel模塊。 使用Ocaml無處不在的功能打開/關閉文件,但使用 In_channel.closeOut_channel.close函數。

問題是,如果讀取文件時引發異常,程序員必須在捕獲到異常時關閉打開的文件。沒有相當於打開文件的垃圾回收器。即使發生異常,使用In_channel.with_file也會照顧正確的文件關閉。

+0

感謝您的答案,歡迎來到Stack Overflow! – hugomg 2014-11-01 02:12:09

3

基本IO在Out_channelIn_channel模塊中實現,該模塊爲舊的out_channelin_channel類型定義了新接口。由於類型相同,因此它是一個很薄的覆蓋層,可以與其他任何庫進行順暢的互操作。

關於close_out_noerr,看起來他們只是錯過了它。在一般情況下,使用Core時應忘記OCaml標準庫,並僅使用後者提供的工具。如果您確實需要舊標準庫,則可以使用Caml模塊。

相關問題