Itcl configbody的适当返回值

时间:2015-06-23 18:42:27

标签: tcl itcl

我想从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

有关
  

如果脚本中没有返回,则其值是脚本中评估的最后一个命令的值。

如果有人会解释这种行为以及我应该如何回来,我会很感激帮助。

1 个答案:

答案 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中调用真实方法,传递所需的任何信息。