Io 在OCaml中,如何创建一个输出通道,将数据写入字符串/缓冲区而不是磁盘上的文件

Io 在OCaml中,如何创建一个输出通道,将数据写入字符串/缓冲区而不是磁盘上的文件,io,ocaml,Io,Ocaml,我有一个in\u channel->out\u channel->unit类型的函数,它将输出一些东西到out\u channel。现在,我想将其输出作为字符串。创建临时文件来写和读似乎很难看,那么我该怎么做呢?除了pervisives.open\u out系列之外,还有其他方法创建out\u频道吗 实际上,这个函数实现了一个repl。我真正需要的是以编程方式对其进行测试,因此我想首先将其包装为string->string类型的函数。为了创建输入通道,我似乎可以使用Scanf.Scanning.

我有一个
in\u channel->out\u channel->unit
类型的函数,它将输出一些东西到
out\u channel
。现在,我想将其输出作为字符串。创建临时文件来写和读似乎很难看,那么我该怎么做呢?除了
pervisives.open\u out
系列之外,还有其他方法创建
out\u频道吗


实际上,这个函数实现了一个repl。我真正需要的是以编程方式对其进行测试,因此我想首先将其包装为
string->string
类型的函数。为了创建
输入通道
,我似乎可以使用
Scanf.Scanning.from\u string
,但我不知道如何创建
out\u通道
参数。

OCaml电池在其
BatIO
模块中具有
输出字符串
输出缓冲区
功能,这些功能似乎可以满足您的要求:


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

如果您不介意您的测试依赖于
Unix
模块,那么您可以使用
Unix.pipe
来创建文件描述符对,从可读端创建
in\u通道
,从可写端创建
out\u通道
,然后将字符串写入可写端,并将\u通道中的
传递给被测代码

创建一个管道。结果的第一个组件将为打开 雷丁,那是管道的出口。第二个组成部分是 开放供写作,那是管道的入口

val in_channel_of_descr : file_descr -> Pervasives.in_channel
创建从给定描述符读取的输入通道。这个 信道最初处于二进制模式;在ic中使用set_二进制_模式 如果需要文本模式,则为false

val out_channel_of_descr : file_descr -> Pervasives.out_channel
在给定描述符上创建输出通道写入。这个 信道最初处于二进制模式;使用设置二进制模式输出oc 如果需要文本模式,则为false

val out_channel_of_descr : file_descr -> Pervasives.out_channel

Unix管道对于任何具有高吞吐量的设备来说都有点重,但对于测试线束来说,它们应该是合适的。

我认为没有办法做到这一点。这会很棘手,因为字符串在OCaml中有固定的长度。它们不太适合作为存储字符的可扩展位置。您可以使用Printf.sprintf创建一个字符串,该字符串的内容与Printf.fprintf写入输出通道的内容相同。但除此之外,您可能还需要构建自己的机制。对于futur读者,该机制现在位于BatBuffer库中: