取消引用 OCaml 指针时匹配总是成功

Match always succeeds when dereferencing pointer 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 return 正确。

我也试过了

if (!mystr = newS) then true else false

这行得通。为什么?

模式中标识符的含义并不是你想象的那样。出现在模式中的任何标识符都是 id 的 new 出现,它将绑定到匹配的任何值。所以,这场比赛:

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

将始终匹配第一种情况。它将标识符 newS 绑定到值 !myStr;但是这没有明显的效果,因为您没有在关联的表达式中使用 newS

模式中的 newS 与标识符 newS 的任何先前出现无关。这是标识符的用法。

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

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

Warning 11: this match case is unused.

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

注意这样的警告是好的。