问题描述
以下是代码摘录: (仅测试此摘录即可发现问题)
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 ())