当解引用指针OCaml时,匹配总是成功的

  • 本文关键字:成功 引用 指针 OCaml ocaml
  • 更新时间 :
  • 英文 :


我的代码如下

let newObj (s) : someObj = 
let myStr = ref s in
let myInt = ref 0 in {
someFun = (fun newS ->
match !myStr with
| newS -> true
| _ -> false
}
;;

我已经测试了这个代码

let test = newObj "right";;
test.someFun "right";;
test.someFun "wrong";;

调用someFun都返回true。

我也试过

if (!mystr = newS) then true else false

,这是可行的。为什么?

模式中标识符的含义并不是您所认为的那样。出现在模式中的任何标识符都是id的new出现,该id将绑定到匹配的任何值。所以,这个match:

match !myStr with
| newS -> true
| _ -> false

总是匹配第一个大小写。它将标识符newS绑定到值!myStr;然而,这没有明显的效果,因为你没有在相关的表达式中使用newS

模式中的newS与标识符newS之前的任何外观无关。这是标识符的一个用法。

这就是if语句起作用的原因。它引用标识符的现有绑定(不涉及模式)。

当我输入上面的表达式时,编译器警告我如下:

Warning 11: this match case is unused.

编译器指出永远不会使用匹配的第二个分支。第一个分支总是匹配。

注意这样的警告是好的。

相关内容

  • 没有找到相关文章

最新更新