递增可变引用时未更新值

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;

当多次调用compileClasscompileObject时,输出总是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 ())