0

我使用了以下两个版本的类变量:

::itcl::class Subcase {
    variable _id
}

::itcl::class Subcase {
    variable _id    -1
}

显然,唯一明显的区别是前者没有初始值。当我使用我的访问器时,它被定义为:

public method ::hwascii::Subcase::Id {{newValue __keep__}} { if {$newValue != "__keep__"} { set _id $newValue }; return [set _id] }

首先设置然后取回该值,我将获得两种不同的行为,具体取决于我用来声明变量的上述版本。在第一个未初始化的情况下,访问器总是会抛出:

can't read "_id": no such variable

但是使用第二个声明,它将按预期工作并返回初始值,或者如果已更改,则返回该新值。

注意1:通过我的访问器设置值总是有效的。

s info variable _id

将报告

protected variable ::hwascii::Subcase::_id -1 42

或者

protected variable ::hwascii::Subcase::_id <undefined> 42

取决于我是否有初始化版本。

注意2:访问器是单行的,因为它是在一个proc中生成的,它使用concat和uplevel来生成一种“默认”访问器。

注意 3:我的 tcl 版本是 8.5 我的 itcl 版本是 3.4 两者都不能更改

问题:我现在有一个可行的解决方案,但想了解其中的区别。一个好的解释将回答我的问题,一个好的文档的指针也很好,但显然是一个链接:

http://www.tcl.tk/man/tcl8.6/Itcl4.0.0Cmd/class.htm#M22

甚至更一般的都不行。

4

1 回答 1

0

Tcl 不会从未设置为定义值的变量中读取,而是会抛出您收到的错误。(在实现级别,未设置的变量对应于 NULL 并在您尝试读取它时始终生成错误;当然,可以捕获该错误并处理它。)如果您没有设置值 - 例如通过variable声明——变量严格存在(即,它分配了存储空间和元数据)但其中没有任何内容,因此当您读取它时会出现错误。如果需要,您可以info exists _id在方法内部使用来检测这种情况;脚本不应该能够通过长期政策看到存在但无价值和根本不存在状态之间的区别。

Itcl 使用 Tcl 的基本变量基础结构。它改变了 Tcl 在方法内部运行时查找变量的方式(变量解析机制),但之后的一切都是纯粹的标准 Tcl 行为。没有值的变量无法读取,并假装根本不存在。(事实上​​,如果不是 Itcl 做了一些特殊的技巧,这个变量将完全不存在,因为这样可以更有效地使用内存资源。)

于 2015-09-25T10:30:35.153 回答