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
中,您会立即看到它只打印了一次;-)