增加可变引用时未更新值

问题描述

以下是代码摘录: (仅测试此摘录即可发现问题)

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 ())