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