为什么使用_防止有警告

问题描述 投票:-1回答:2

我有以下代码(这是一个测试所以它没有任何有趣的东西)

let test k =
   let rec aux = function 
     |0 -> 0
     |z when z = 2 -> raise Exit 
     |_ -> aux (k-1) 
   in try let _ = aux k in true
   with Exit -> false

最后使用语法:let _,对我来说,当你不知道可以用来定义你的函数的名字时,它只是一种语法。

但是,如果我做以下事情:

let test k =
   let rec aux = function 
     |0 -> 0
     |z when z = 2 -> raise Exit 
     |_ -> aux (k-1) 
   in try let b = aux k in true
   with Exit -> false

我得到一个警告:“变量b未使用”,我不明白为什么let _let b之间存在差异?

例如,我知道在处理单位类型时,通常使用语法:let ()。但是在做的时候我没有任何警告:

let b = print_int 2 

即使我不使用:

let () = print_int 2 

那么let _有什么特别之处呢?

谢谢 !

ocaml
2个回答
0
投票

您有第二个代码的警告,因为您定义了包含值的变量b,之后您不再使用它。如果您不想使用任何表达式的结果,最好的用法是使用'let _ ='结构丢弃其结果(它告诉您希望对表达式进行评估,以获得潜在的副作用,但不要小心保留结果)。

对于问题的第二部分,我认为有与顶部循环相关的不同规则,因此行为可能无法比较。在第一部分中,在函数内定义b,在第二部分中,在顶部循环内定义b。在顶部循环中,您可以定义在不收到警告的情况下不会使用的变量。


0
投票

这是编译器认可的一种约定,表示您不会使用计算结果,例如:

let a = 5 + 6 in
()

将(或不会,取决于您的警告设置)触发未使用的变量警告,因为您明确将结果绑定到变量a,但在其余计算中不使用它。在命令式语言中,为其副作用计算表达式并忽略生成的值(如果有的话)是很常见的。由于OCaml是一种函数式语言,其中值用于生成值,当您忘记使用绑定变量时,它通常是错误的指示符。

因此,要明确告诉编译器您忽略了该值,您可以使用下划线开始变量,例如,

let _unusued = 5 + 6 in 
()

您可以使用野生模式_(也以下划线开头)。

© www.soinside.com 2019 - 2024. All rights reserved.