0

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

当我返回空字符串时,文件名未设置为新值。如果我不返回而只是让 proc 失败,则文件名确实会改变。您可以通过将上述代码中的 1 更改为 0 来看到这一点。

我怀疑它与以下陈述有关:

当脚本中没有返回时,它的值是脚本中最后一个命令的值。

如果有人能解释这种行为以及我应该如何返回,我将不胜感激。

4

1 回答 1

1

Tclreturn通过抛出异常(类型为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,传入任何需要的信息。

于 2015-06-24T12:43:22.053 回答