16

我有一个类型的函数in_channel -> out_channel -> unit,它将输出一些东西到out_channel. 现在我想将它的输出作为一个字符串。创建临时文件来写入和读取它看起来很难看,那么我该怎么做呢?out_channel除了Pervasives.open_out家庭,还有其他的创作方式吗?

实际上,这个函数实现了一个 repl。我真正需要的是以编程方式对其进行测试,所以我想先将它包装成一个 type 的函数string -> string。对于创建in_channel,似乎我可以使用Scanf.Scanning.from_string,但我不知道如何创建out_channel参数。

4

2 回答 2

7

OCaml Batteries Included 在其模块中具有output_stringoutput_buffer功能BatIO似乎可以满足您的需求: http: //ocaml-batteries-team.github.com/batteries-included/hdoc/BatIO.html

它可能需要您使用他们的输入/输出类型。

于 2012-09-22T04:13:08.107 回答
3

如果你不介意你的测试依赖于Unix模块,那么你可以使用Unix.pipe创建一个文件描述符对,in_channel从可读端创建一个,out_channel从可写端创建一个,然后将字符串写入可写端并传递in_channel给被测代码。

val pipe : unit -> file_descr * file_descr

创建管道。结果的第一个组件被打开以供读取,即管道的出口。第二个组件是打开写的,也就是管道的入口。

val in_channel_of_descr : file_descr -> Pervasives.in_channel

创建从给定描述符读取的输入通道。通道最初是二进制模式;如果需要文本模式,请使用 set_binary_mode_in ic false。

val out_channel_of_descr : file_descr -> Pervasives.out_channel

在给定的描述符上创建一个输出通道。通道最初是二进制模式;如果需要文本模式,请使用 set_binary_mode_out oc false。

Unix 管道对于任何具有高吞吐量的东西来说有点重,但对于测试工具来说它们应该没问题。

于 2013-12-13T21:17:59.207 回答