【问题标题】:why the use of _ prevent having warnings为什么使用 _ 防止出现警告
【发布时间】:2019-09-04 16:10:31
【问题描述】:

我有以下代码(这是一个测试,所以没有什么有趣的)

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


【解决方案1】:

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

let a = 5 + 6 in
()

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

因此,要明确告诉编译器您正在忽略该值,您可以以下划线开头,例如,

let _unusued = 5 + 6 in 
()

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多