递增可变引用时未更新值
value not updated when incrementing mutable ref
以下是代码摘录:
(仅测试此摘录即可发现问题)
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 ())
以下是代码摘录: (仅测试此摘录即可发现问题)
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 ())