gpt4 book ai didi

f# - 在 f# 中捕获打印语句

转载 作者:行者123 更新时间:2023-12-04 17:44:03 25 4
gpt4 key购买 nike

我想知道是否有定义函数的好方法captureOutput它采用函数 f可能包含打印语句并返回 f 的任何内容打印。例如。,

let f x = print "%s" x
let op = captureOutput (f "Hello World")

val op : string = "Hello World"

我在想也许有一个很好的方法可以用 Console.ReadLine() 异步执行此操作但我无法解决任何问题。

干杯

编辑:

根据 Fyodor Soikin 的评论,以下代码可以满足我的要求:
let captureOutput f x =
let newOut = new IO.StringWriter()
Console.SetOut(newOut)
f x
Console.SetOut(Console.Out)
newOut.ToString()

最佳答案

您可以通过 Console.SetOut 临时替换标准输出编写器.

但请注意:这种替换也会影响在其他线程上执行的代码,并捕获它们的输出,并与函数的输出混合。这本质上就是所谓的“黑客”。

如果这只适用于永远不会变得更复杂的非常小的实用程序,那么这很好。但这绝不应该成为生产系统的一部分。如果您正在开发复杂事物的一部分,我建议您更改函数本身,通过打印函数对其进行参数化:

type Printer = abstract member print (fmt: StringFormat<'T, unit>) : 'T

let captureOutput f =
let mutable output = ""
let print s = output <- output + s
f { new Printer with member _.print fmt = kprintf print fmt }
output

let f x (p: Printer) = p.print "%s" x
let op = captureOutput (f "Hello World")

(这个例子必须使用一个接口(interface),因为没有它 print 函数将失去通用性)

关于f# - 在 f# 中捕获打印语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42822226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com