itcl 中未初始化和初始化 class 变量之间的区别
difference between uninitialized and initialized class variable in itcl
我使用了以下两个版本的 class 变量:
::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
但是对于第二个声明,它将按预期工作,并且 return 要么是初始值,要么是新值(如果已更改)。
注意 1:通过我的访问器设置值始终有效。
s info variable _id
将报告
protected variable ::hwascii::Subcase::_id -1 42
或
protected variable ::hwascii::Subcase::_id <undefined> 42
看我有没有初始化版本
注2:
accessor 是一个 one liner,因为它是在一个 proc 中生成的,它使用 concat 和 uplevel 生成一种 "default" accessor.
注3:
我的tcl版本是8.5
我的 itcl 版本是 3.4
两者都不能更改
问题:
我现在有一个可行的解决方案,但想了解其中的区别。一个好的解释会回答我的问题,指向一个好的文档的指针也很好,但显然 link 到:
http://www.tcl.tk/man/tcl8.6/Itcl4.0.0Cmd/class.htm#M22
甚至更一般的都不行。
Tcl 不会读取未设置为定义值的变量,而是抛出您收到的错误。 (在实现级别,未设置的变量对应于 NULL,并且 consistently 会在您尝试读取它时生成错误;当然,可以捕获该错误并进行处理。)如果你没有设置一个值——比如通过 variable
声明——变量严格存在(即,它有存储 space 和分配的元数据)但是没有任何东西在里面所以你得到从中读取时出错。如果需要,您可以在方法内部使用 info exists _id
来检测这种情况;根据长期政策,脚本不应该能够看到存在但无价值和根本不存在状态之间的区别。
Itcl 使用 Tcl 的基本变量基础结构。它改变了 Tcl 在 运行 内部方法(变量解析机制)中查找变量的方式,但之后的一切都是纯粹的标准 Tcl 行为。没有值的变量无法读取,假装根本不存在。 (事实上 ,如果不是 Itcl 做了一些特殊的技巧,该变量将完全不存在,因为这是对内存资源的更有效利用。)
我使用了以下两个版本的 class 变量:
::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
但是对于第二个声明,它将按预期工作,并且 return 要么是初始值,要么是新值(如果已更改)。
注意 1:通过我的访问器设置值始终有效。
s info variable _id
将报告
protected variable ::hwascii::Subcase::_id -1 42
或
protected variable ::hwascii::Subcase::_id <undefined> 42
看我有没有初始化版本
注2: accessor 是一个 one liner,因为它是在一个 proc 中生成的,它使用 concat 和 uplevel 生成一种 "default" accessor.
注3: 我的tcl版本是8.5 我的 itcl 版本是 3.4 两者都不能更改
问题: 我现在有一个可行的解决方案,但想了解其中的区别。一个好的解释会回答我的问题,指向一个好的文档的指针也很好,但显然 link 到:
http://www.tcl.tk/man/tcl8.6/Itcl4.0.0Cmd/class.htm#M22
甚至更一般的都不行。
Tcl 不会读取未设置为定义值的变量,而是抛出您收到的错误。 (在实现级别,未设置的变量对应于 NULL,并且 consistently 会在您尝试读取它时生成错误;当然,可以捕获该错误并进行处理。)如果你没有设置一个值——比如通过 variable
声明——变量严格存在(即,它有存储 space 和分配的元数据)但是没有任何东西在里面所以你得到从中读取时出错。如果需要,您可以在方法内部使用 info exists _id
来检测这种情况;根据长期政策,脚本不应该能够看到存在但无价值和根本不存在状态之间的区别。
Itcl 使用 Tcl 的基本变量基础结构。它改变了 Tcl 在 运行 内部方法(变量解析机制)中查找变量的方式,但之后的一切都是纯粹的标准 Tcl 行为。没有值的变量无法读取,假装根本不存在。 (事实上 ,如果不是 Itcl 做了一些特殊的技巧,该变量将完全不存在,因为这是对内存资源的更有效利用。)