我想从configbody返回但不能明确地这样做而不会导致变量不被设置。
我希望能帮助理解我所看到的行为。请考虑以下代码(使用Itcl 3.4):
package require Itcl
catch {itcl::delete class Model}
itcl::class Model {
public variable filename "orig"
}
itcl::configbody Model::filename {
if 1 {
return ""
} else {
}
}
Model my_model
my_model configure -filename "newbie"
puts "I expect the result to be 'newbie:' [my_model cget -filename]"
当我返回空字符串时,filename不会设置为新值。如果我不返回但只允许proc通过,则filename确实会改变。您可以通过在上面的代码中将1更改为0来看到这一点。
我怀疑它与以下statement:
有关如果脚本中没有返回,则其值是脚本中评估的最后一个命令的值。
如果有人会解释这种行为以及我应该如何回来,我会很感激帮助。
答案 0 :(得分:1)
Tcl通过抛出异常(类型为return
)来处理TCL_RETURN
。通常,过程或方法处理程序的外部部分拦截该异常并将其转换为过程/方法的正常结果,但是您可以使用catch
拦截事物并在封面下看一下。
但是,configbody
不使用该机制。它只是在某些上下文中运行脚本(不确定是什么!),并且该上下文将TCL_RETURN
视为更新失败的指示。
解决方法:
itcl::configbody Model::filename {
catch {
if 1 {
return ""
} else {
}
} msg; set msg
# Yes, that's the single argument form of [set], which READS the variable...
}
或者在configbody
中调用真实方法,传递所需的任何信息。