我使用了以下两个版本的类变量:
::itcl::class Subcase {
variable _id
}
和
::itcl::class Subcase {
variable _id -1
}
显然,唯一明显的区别是,前者没有初始值。 当我使用我的Accessor时,定义为:
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
或更普遍的不会。
答案 0 :(得分:0)
Tcl不会读取未设置为定义值的变量,而是会抛出您收到的错误。 (在实现级别,未设置的变量对应于NULL,并且始终在您尝试读取时会生成错误;当然,可以捕获该错误并处理它。)如果您'没有设置值 - 例如通过variable
声明 - 变量严格存在(即,它有分配的存储空间和元数据)但是没有任何内容,所以当你从中读取时会出现错误。如果需要,您可以在方法中使用info exists _id
来检测此案例;脚本不应该通过长期政策来看待存在但没有价值和不存在的状态之间的区别。
Itcl使用Tcl的基本变量基础设施。它改变了Tcl在内部方法(变量解析机制)中运行时查找变量的方式,但之后的所有内容都是纯粹的标准Tcl行为。没有值的变量不能被读取,并假装根本不存在。 (实际上,如果不是Itcl做了一些特殊的技巧,那么变量将完全不存在,因为这会更有效地利用内存资源。)