定义一个基于引用返回另一个函数的函数
Defining a function returning another function based on a reference
下面的代码没有像我想象的那样工作:
let debug_flag = ref false
let dprintf = let open Printf in
match !debug_flag with
| true -> printf
| false -> ifprintf stdout
let test_dprintf () =
begin
debug_flag := true;
Printf.printf "print1\n";
dprintf "print2\n";
Printf.printf "print3\n";
debug_flag := false
end
我希望它能输出
print1
print2
print3
然而它只打印
print1
print3
在test_dprintf
中将true
分配给debug_flag
似乎根本没有任何影响。
有谁知道为什么?如果是这样,您是否知道可能的解决方法?
我正在使用 OCaml 4.09.0
感谢您的回答
dprintf
的定义不是函数表达式。它是一个将 return 函数的表达式,但仅在计算 dprintf
的定义时才计算表达式本身,而不是在调用它 returns 的函数时计算。
要解决这个问题,您可以将参数显式化:
let dprintf fmt = let open Printf in
match !debug_flag with
| true -> printf fmt
| false -> ifprintf stdout fmt
现在 dprintf
的主体将在调用时进行计算。
下面的代码没有像我想象的那样工作:
let debug_flag = ref false
let dprintf = let open Printf in
match !debug_flag with
| true -> printf
| false -> ifprintf stdout
let test_dprintf () =
begin
debug_flag := true;
Printf.printf "print1\n";
dprintf "print2\n";
Printf.printf "print3\n";
debug_flag := false
end
我希望它能输出
print1
print2
print3
然而它只打印
print1
print3
在test_dprintf
中将true
分配给debug_flag
似乎根本没有任何影响。
有谁知道为什么?如果是这样,您是否知道可能的解决方法?
我正在使用 OCaml 4.09.0
感谢您的回答
dprintf
的定义不是函数表达式。它是一个将 return 函数的表达式,但仅在计算 dprintf
的定义时才计算表达式本身,而不是在调用它 returns 的函数时计算。
要解决这个问题,您可以将参数显式化:
let dprintf fmt = let open Printf in
match !debug_flag with
| true -> printf fmt
| false -> ifprintf stdout fmt
现在 dprintf
的主体将在调用时进行计算。