使用OCaml时,我几乎总是在let _ = exp
中使用下划线通配符,尤其是当exp
的结果不重要时,但其中的计算是。例如:
let _ = print_endline "abc" in ... let _ = a := !a + 1 in ... let _ = do_some_thing ... in
所以,我只是想知道广泛使用let _ = ...
是否有任何副作用?
答案 0 :(得分:10)
副作用是将来在您的软件中跟踪的烦恼。 let _ =
的问题在于它会默默地忽略您想要的部分应用程序。假设您编写以下内容:
let f a b = ...
let _ = f 3 4
将来你会在f
添加一个参数:
let f a b c = ...
表达式let _ = f 3 4
仍将静默编译,程序不会调用该函数,让您想知道发生了什么。如果您需要忽略非单位结果,最好总是让()
并使用ignore
:
let () = ignore (f 3 4)
let () = print_endline "abc"
使用let _ = ...
应被视为不良风格。
答案 1 :(得分:1)
不,广泛使用let _ =
绝对没有任何后果。编译器不会为全局环境添加名称,因为您没有给它。
答案 2 :(得分:1)
let
的目的是将值绑定到标识符。如果你只是做副作用,最好将它包装在begin .. end
块中。在你的情况下:
begin
print_endline "abc";
a := !a + 1;
do_some_thing ();
end