取消引用 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.
编译器指出永远不会使用匹配的第二个分支。第一个分支总是匹配。
注意这样的警告是好的。
我的代码如下
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.
编译器指出永远不会使用匹配的第二个分支。第一个分支总是匹配。
注意这样的警告是好的。