let make f =
printfn "1"
use file = File.CreateText("abc.txt")
let v = f file
printfn "2"
v
let f (x: StreamWriter) (y:int) =
printfn "3"
x.WriteLine("{0}", y)
let a = make f
> 1
> 2
> val a : (int -> unit)
a 8
System.ObjectDisposedException: The object was used after being disposed.
编译时不会给我任何错误或警告,但在运行时它会触发这样的错误。
我是否必须使用完整版let make f y = ...
来避免咖喱形式?
答案 0 :(得分:6)
use
关键字确保在词法范围结束时调用Dispose
方法。这意味着它会在您从make
函数返回值时调用它。问题是,在您的情况下,返回的值是稍后调用的函数。
换句话说,你所写的内容也可以被视为:
let make f =
printfn "1"
use file = File.CreateText("abc.txt")
printfn "2"
(fun y -> f file y)
在这里,您可以看到为什么这不起作用。如果要在处理文件之前使用所有参数调用函数f
,则需要编写如下内容:
let make f y =
printfn "1"
use file = File.CreateText("abc.txt")
let v = f file y
printfn "2"
v