如果属性本身具有名称值,如何为 oo::configurable 编写 -get 脚本

问题描述 投票:0回答:1

我有下一个代码:

    oo::configurable create Temp {
    superclass SPICEElement
    property name -set {
        set name [string tolower $value]
    }
    property value -get {
        return [$value configure -value]
    }
    variable name value
    constructor {value args} {
        # Creates object of class `Temp`.
        #  value - value of the temperature
        #  args - optional parameter qualificator -eq
        # This class represent .temp statement with temperature value.
        set arguments [argparse {
            {-eq -boolean}
        }]
        my configure -name temp
        if {$eq} {
            my AddParam temp $value -eq
        } else {
            my AddParam temp $value
        }
    }
    method AddParam {paramName value args} {
        # Adds temperature parameter.
        #  paramName - name of temperature parameter
        #  value - value of temperature
        #  args - optional parameter qualificator -eq
        set arguments [argparse {
            {-eq -boolean} 
        }]
        if {$eq} {
            set value [::SpiceGenTcl::ParameterPositionalEquation new $paramName $value]
        } else {
            set value [::SpiceGenTcl::ParameterPositional new $paramName $value]
        }
        return
    }
    method genSPICEString {} {
        # Creates .temp statement string for SPICE netlist.
        # Returns: '.temp $Value'
        return ".temp [[my configure -value] genSPICEString]"
    }
}
oo::define Temp {
    method <WriteProp-value> val {
        lassign $val value eq
        if {$eq=="-eq"} {
            my AddParam temp $val -eq
        } elseif {$eq==""} {
            my AddParam temp $val
        } else {
            return -code error "Wrong value '$eq' of qualifier"
        }
    }    
}

对象

::SpiceGenTcl::ParameterPositionalEquation
::SpiceGenTcl::ParameterPositional
拥有同名财产
value
。 所以,当我尝试运行下一个测试时:

test testTempClass-1 {test creation of Temp class instance and genSPICEString interface} -setup {
    set temp [Temp new 10]
} -body {
    set result [$temp genSPICEString]
} -result ".temp 10" -cleanup {
    unset temp result
}

我收到下一条错误消息:

    ---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: can't read "value": no such variable
    while executing
"$value configure -value"
    (class "::SpiceGenTcl::Temp" method "<ReadProp-value>" line 2)
    invoked from within
"my configure -value"
    (class "::SpiceGenTcl::Temp" method "genSPICEString" line 4)
    invoked from within
"$temp genSPICEString"
    ("uplevel" body line 2)

如您所见,我重新定义了方法

<WriteProp-value>
以允许在设置器内使用
val
名称作为变量名称。它有效,但不适用于自定义
-get
方法,我不明白为什么。它应该使用该对象的
value
方法调用存储在
configure
属性中的对象,并返回存储在被调用对象的
value
属性中的字符串。我认为我应该重新定义
<ReadProp-value>
而不是在
property
中定义它,但它也因相同的错误而失败。

提前谢谢您。

oop tcl
1个回答
0
投票

您需要在对象中设置变量才能在属性读取器的实现中读取它。到目前为止,就这么简单。问题是构造函数没有写入实例变量。原因是烦人

这是因为 Tcl 过程编译器(方法重用它,构造函数是特殊方法)已将

value
解析为形式参数,因此甚至不查看有关
variable
声明中设置的变量的说明。您需要通过其他机制来设置变量。

可能的修复方法

其中任何一个都会进入构造函数。

set [my varname value] $value

依赖于默认的

varname
方法在设计上完全忽略局部变量这一事实。 (它旨在为
vwait
和 Tk 小部件生成全局句柄,但它在这里也同样有效。)

my configure -value $value

如果该属性是可写的,则直接写入即可。局部变量不会混淆它。我认为这更优雅,但它确实限制了该属性是标准模型可写的。

或者您可以只更改构造函数或实例变量的参数名称。

© www.soinside.com 2019 - 2024. All rights reserved.