我的代码如下
let newObj (s) : someObj =
let myStr = ref s in
let myInt = ref 0 in {
someFun = (fun newS ->
match !myStr with
| newS -> true
| _ -> false
}
;;
Run Code Online (Sandbox Code Playgroud)
我已经测试过这段代码
let test = newObj "right";;
test.someFun "right";;
test.someFun "wrong";;
Run Code Online (Sandbox Code Playgroud)
对 someFun 的两次调用都返回 true。
我也尝试过
if (!mystr = newS) then true else false
Run Code Online (Sandbox Code Playgroud)
这有效。为什么?
模式中标识符的含义并不是您想象的那样。模式中出现的任何标识符都是id 的新出现,它将绑定到任何匹配的值。那么,这场比赛:
match !myStr with
| newS -> true
| _ -> false
Run Code Online (Sandbox Code Playgroud)
将始终匹配第一个案例。它将标识符绑定newS到值!myStr;但是,这没有明显的效果,因为您没有newS在关联的表达式中使用。
模式newS中的 与标识符之前的任何出现无关newS。这是标识符的新用途。
这就是该if声明有效的原因。它指的是标识符的现有绑定(不涉及模式)。
正如我旁注的那样,当我输入上面的表达式时,编译器会警告我如下:
Warning 11: this match case is unused.
Run Code Online (Sandbox Code Playgroud)
编译器指出匹配的第二个分支永远不会被使用。第一个分支始终匹配。
注意这样的警告是有好处的。