如何在不启动tcl shell的情况下为itcl类分配资源

如何在不启动tcl shell的情况下为itcl类分配资源,tcl,itcl,Tcl,Itcl,使用此Tcl脚本:A.Tcl itcl::class ::A { variable list1 {} public method getList {} { return $list1 } } 我这样做: 启动tcl shell并以交互方式执行source A.tcl 然后在A.tcl 为了使更改生效,我重新创建了文件A.tcl 当我重新编译源代码时,我得到以下错误 %source/home/manid/scripts/test.tcl “A”类已存

使用此Tcl脚本:
A.Tcl

itcl::class ::A {
    variable list1 {}
    public method getList {} {
        return $list1
    } 
}
我这样做:

  • 启动tcl shell并以交互方式执行
    source A.tcl
  • 然后在
    A.tcl
  • 为了使更改生效,我重新创建了文件
    A.tcl
  • 当我重新编译源代码时,我得到以下错误
%source/home/manid/scripts/test.tcl “A”类已存在
我怎样才能克服这个错误?有没有一种方法可以在不退出shell的情况下获取类定义中的最新更改?

您需要以不同的方式编写代码。特别是,必须将方法体的定义(可以重复)放在类的声明之外(不能重复)。然后,您创建一个条件类(使用
itcl::is class
作为测试工具),并使用
itcl::body
实际提供方法定义

根据这些原则,将您的
A.tcl
改写为:

if {![itcl::is class ::A]} {
    itcl::class ::A {
        variable list1 {}
        # *Dummy* method body; method must exist, but may be empty
        public method getList {} {}
    }
}

itcl::body ::A::getList {} {
    return $list1
}
将允许您多次
source
,以根据需要更改方法体。这并没有给你改变一切的自由(例如,变量声明和范围规则是固定的);您需要切换到类似TclOO的东西来获得这种灵活性

if {![itcl::is class ::A]} {
    itcl::class ::A {
        variable list1 {}
        # *Dummy* method body; method must exist, but may be empty
        public method getList {} {}
    }
}

itcl::body ::A::getList {} {
    return $list1
}