Reference 递增可变参考时未更新值

Reference 递增可变参考时未更新值,reference,ocaml,Reference,Ocaml,以下是代码摘录: (仅通过测试此摘录即可发现问题) 让cptIdCO=ref 0;;(*编译器:id类和对象全局*) 让我们来看看拉索罗布= cptIdCO:=!cptIdCO+1; “ClObj”^(字符串,由int!cptIdCO组成)^:NOP\n;; 让我们编译类cls= 打印字符串“-compileClass\n”; (*fillClass cls;*) 打印字符串maketiclassorobj; 和编译对象对象= 打印字符串“\t--compileObject\n”; 打印字符串m

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

让cptIdCO=ref 0;;(*编译器:id类和对象全局*)
让我们来看看拉索罗布=
cptIdCO:=!cptIdCO+1;
“ClObj”^(字符串,由int!cptIdCO组成)^:NOP\n;;
让我们编译类cls=
打印字符串“-compileClass\n”;
(*fillClass cls;*)
打印字符串maketiclassorobj;
和编译对象对象=
打印字符串“\t--compileObject\n”;
打印字符串maketiclassorobj;
多次调用
compileClass
compileObject
时,输出总是
ClObj_1:NOP
,因此引用似乎没有更新,我不明白为什么


我看到了
^:=
的一些用法^
但它不起作用,我不理解普通版本和
^
版本之间的区别。

问题不在于更新引用的方式,而是
MakeeClass
不是一个函数,只是一个包含字符串的变量,在初始化它之前,它碰巧会递增
cptIdCO
一次

函数与变量的不同之处在于它接受参数。如果不需要其他任何东西,您可以使用单元
()

这将满足您的期望:

让cptIdCO=ref 0;;(*编译器:id类和对象全局*)
设makeEtiClassOrObj()=
cptIdCO:=!cptIdCO+1;
“ClObj”^(字符串,由int!cptIdCO组成)^:NOP\n;;
让我们编译类cls=
打印字符串“-compileClass\n”;
(*fillClass cls;*)
打印字符串(makeEtiClassOrObj())
和编译对象对象=
打印字符串“\t--compileObject\n”;
打印字符串(makeEtiClassOrObj())

问题不在于更新引用的方式,而在于
makeEtiClass
不是一个函数,只是一个包含字符串的变量,它在初始化之前会增加
cptIdCO
一次

函数与变量的不同之处在于它接受参数。如果不需要其他任何东西,您可以使用单元
()

这将满足您的期望:

让cptIdCO=ref 0;;(*编译器:id类和对象全局*)
设makeEtiClassOrObj()=
cptIdCO:=!cptIdCO+1;
“ClObj”^(字符串,由int!cptIdCO组成)^:NOP\n;;
让我们编译类cls=
打印字符串“-compileClass\n”;
(*fillClass cls;*)
打印字符串(makeEtiClassOrObj())
和编译对象对象=
打印字符串“\t--compileObject\n”;
打印字符串(makeEtiClassOrObj())

调试此类操作的一种方法是在您希望执行的值中添加输出打印。如果您只是将
print_int(!cptIdCO)
放入
makeEtiClassOrObj
中,您会立即看到它只打印了一次;-)调试这种事情的一种方法是在您希望执行的值中添加输出打印。如果您只是将
print_int(!cptIdCO)
放入
makeEtiClassOrObj
中,您会立即看到它只打印了一次;-)