我正在参加TCL的速成课程,我遇到了TCL中的数组问题。我有两个类,比如A和B.在B类中,我有一个更新本地数组的方法。数组的格式如下:
filterData(1) = 23904890234009
filterData(2) = 28974501002990
filterData(3) = 69398018930453
......它就在那里停止了。只有3个指数。在A类中,我实例化一个B对象并在其上运行一个方法来更新本地数组。 B类中的方法如下所示:
method addData {} {
lappend filterData($type) $data
}
$ type变量是数字1-3,$ data变量是一串数字。每当我运行这个方法并打印数组内容时,它就没有任何内容,就像它是一个新数组一样。奇怪的是,我在B类中有其他局部变量(列表,字符串),我执行与持久相同的操作,这与此类似乎重置自身的数组不同。关于我如何处理这个错误的任何想法?如果需要更多信息,我可以提供。
答案 0 :(得分:2)
在Itcl中,这种事情的行为关键取决于你的变量声明。这是一个带有简单变量声明的例子
% package req Itcl 4
4.0b7
% itcl::class Foo {
variable filterData
method addData {type data} {
lappend filterData($type) $data
}
}
% Foo a
a
% a addData 1 2
2
% a addData 1 3
2 3
% Foo b
b
% b addData 1 4
4
% a addData 1 5
2 3 5
请注意a
和b
如何不共享filterData
数组?它是实例变量。对于在许多实例之间共享的类变量,您可以使用common
来声明它们:
% package req Itcl 4
4.0b7
% itcl::class Foo {
common filterData
method addData {type data} {
lappend filterData($type) $data
}
}
% Foo a
a
% a addData 1 2
2
% a addData 1 3
2 3
% Foo b
b
% b addData 1 4
2 3 4
% a addData 1 5
2 3 4 5
看看我如何更改声明中的一个单词并获得共享变量(真正的共享数组)?
答案 1 :(得分:1)
我昨天最终搞清了这个问题。问题在于我的数组声明。在我之前:
array set filterData {}
...而且只在我的代码顶部。然后我把它改成了:
variable filterData
array set filterData {}
然后变量保存到我已经在属于该类的方法的后续调用中实例化的类对象。我这是一个愚蠢的错误。