0

我正在学习 TCL 的速成课程,但在 TCL 中遇到了数组问题。我有两个类,比如 A 和 B。在类 BI 中有一个更新本地数组的方法。数组的格式是这样的:

filterData(1) = 23904890234009
filterData(2) = 28974501002990
filterData(3) = 69398018930453 

......它停在那里。只有 3 个指标。在 A 类中,我实例化了一个 B 对象并在其上运行一个方法来更新本地数组。B 类中的方法如下所示:

method addData {} {
    lappend filterData($type) $data
}

$type 变量是一个数字 1-3,$data 变量是一串数字。每当我运行此方法并打印数组内容时,它里面什么都没有,就像它是一个新数组一样。奇怪的是,我在 B 类中有其他局部变量(列表、字符串),我对它们执行相同的操作,这些变量是持久的,不像这个似乎正在重置自身的数组。关于我如何错误地处理这个问题的任何想法?如果需要更多信息,我可以提供。

4

2 回答 2

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

注意如何ab不共享他们的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

看看我是如何在声明中更改一个词并获得共享变量(真的是共享数组)?

于 2014-08-13T08:45:20.667 回答
1

我昨天终于解决了这个问题。问题出在我的数组声明上。在我有之前:

array set filterData {}

...而且只有在我的代码顶部。然后我将其更改为:

variable filterData
array set filterData {}

然后该变量保存到我在随后调用属于该类的方法时实例化它的类对象。这是我的一个愚蠢的错误。

于 2014-08-13T15:35:54.707 回答