TCL阵列:数据不持久?

TCL阵列:数据不持久?,tcl,class-variables,itcl,Tcl,Class Variables,Itcl,我正在学习TCL的速成课程,我遇到了TCL中的阵列问题。我有两个类,比如A和B。在B类中,我有一个更新本地数组的方法。数组的格式如下所示: filterData(1) = 23904890234009 filterData(2) = 28974501002990 filterData(3) = 69398018930453 。。。它就停在那里。只有3个指数。在类A中,我实例化了一个B对象并在其上运行一个方法来更新本地数组。类B中的方法如下所示: method addData {} {

我正在学习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类中还有其他局部变量(列表、字符串),我对它们执行相同的操作,这些变量是持久的,不像这个数组,它似乎在重置自身。关于我如何错误地处理这个问题,有什么想法吗?如果需要更多信息,我可以提供

在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

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

在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

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

在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

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

在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

看到我如何更改声明中的一个单词并获得共享变量(真正的共享数组)了吗?

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

array set filterData {}
…我的代码中只有这一点。然后我把它改成:

variable filterData
array set filterData {}

然后变量被保存到我在后续调用属于该类的方法时实例化的类对象中。我犯了一个愚蠢的错误

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

array set filterData {}
…我的代码中只有这一点。然后我把它改成:

variable filterData
array set filterData {}

然后变量被保存到我在后续调用属于该类的方法时实例化的类对象中。我犯了一个愚蠢的错误

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

array set filterData {}
…我的代码中只有这一点。然后我把它改成:

variable filterData
array set filterData {}

然后变量被保存到我在后续调用属于该类的方法时实例化的类对象中。我犯了一个愚蠢的错误

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

array set filterData {}
…我的代码中只有这一点。然后我把它改成:

variable filterData
array set filterData {}

然后变量被保存到我在后续调用属于该类的方法时实例化的类对象中。我犯了一个愚蠢的错误

使用
方法
表明这是Tcl的面向对象扩展之一。常规Tcl使用动态范围,这意味着
proc
内部的变量与外部同名的变量不同。为了能够告诉您什么是适合您的,我们需要知道您使用的是什么类型的OO扩展。@Hoodiecrow代码顶部包含的包有Tk、Itcl、img::bmp、udp和configfile。这回答了你的问题吗?我相信Itcl是您感兴趣的。是的,Itcl是相关的软件包。不幸的是,我对incr tcl一无所知,因此必须有其他人来帮助您。如果您发布代码,这将对我们有很大帮助。使用
方法
表明这是tcl的面向对象扩展之一。常规Tcl使用动态范围,这意味着
proc
内部的变量与外部同名的变量不同。为了能够告诉您什么是适合您的,我们需要知道您使用的是什么类型的OO扩展。@Hoodiecrow代码顶部包含的包有Tk、Itcl、img::bmp、udp和configfile。这回答了你的问题吗?我相信Itcl是您感兴趣的。是的,Itcl是相关的软件包。不幸的是,我对incr tcl一无所知,因此必须有其他人来帮助您。如果您发布代码,这将对我们有很大帮助。使用
方法
表明这是tcl的面向对象扩展之一。常规Tcl使用动态范围,这意味着
proc
内部的变量与外部同名的变量不同。能说出你的目的是什么