如何解决增加可变引用时未更新值
以下是代码摘录: (仅测试此摘录即可发现问题)
let cptIdCO = ref 0;; (* compteur : id Classe et Object globale *)
let makeEtiClassOrObj =
cptIdCO := !cptIdCO + 1;
"ClObj_" ^ (string_of_int !cptIdCO) ^ ": NOP\n";;
let compileClass cls =
print_string "-- compileClass\n";
(*fillClass cls;*)
print_string makeEtiClassOrObj;
and compileObject obj =
print_string "\t-- compileObject \n";
print_string makeEtiClassOrObj;
多次调用 compileClass
或 compileObject
时,输出始终为 ClObj_1: NOP
,因此似乎引用未更新,我不明白为什么。
我看到了 ^:=
和 !^
的一些用法,但它不起作用,我不明白普通版本和 ^
版本之间的区别。
解决方法
问题不在于你更新引用的方式,而是 makeEtiClass
不是一个函数,只是一个保存字符串的变量,它碰巧在初始化之前增加一次 cptIdCO
。
函数与变量的不同之处在于它接受参数。如果不需要其他任何东西,您可以使用单位 ()
。
这将满足您的期望:
let cptIdCO = ref 0;; (* compteur : id Classe et Object globale *)
let makeEtiClassOrObj () =
cptIdCO := !cptIdCO + 1;
"ClObj_" ^ (string_of_int !cptIdCO) ^ ": NOP\n";;
let compileClass cls =
print_string "-- compileClass\n";
(*fillClass cls;*)
print_string (makeEtiClassOrObj ())
and compileObject obj =
print_string "\t-- compileObject \n";
print_string (makeEtiClassOrObj ())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。