我有下一个代码:
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
中定义它,但它也因相同的错误而失败。
提前谢谢您。
您需要在对象中设置变量才能在属性读取器的实现中读取它。到目前为止,就这么简单。问题是构造函数没有写入实例变量。原因是烦人。
这是因为 Tcl 过程编译器(方法重用它,构造函数是特殊方法)已将
value
解析为形式参数,因此甚至不查看有关 variable
声明中设置的变量的说明。您需要通过其他机制来设置变量。
其中任何一个都会进入构造函数。
set [my varname value] $value
依赖于默认的
varname
方法在设计上完全忽略局部变量这一事实。 (它旨在为 vwait
和 Tk 小部件生成全局句柄,但它在这里也同样有效。)
my configure -value $value
如果该属性是可写的,则直接写入即可。局部变量不会混淆它。我认为这更优雅,但它确实限制了该属性是标准模型可写的。
或者您可以只更改构造函数或实例变量的参数名称。