为什么以下Tcl代码中声明的可选参数实际不可选?
问题根因
这个报错是Tcl过程的参数解析规则导致的,具体如下:
- 你定义
var过程时使用的参数列表{varname = args}会被Tcl识别为3个独立参数:- 第1个必填位置参数:
varname - 第2个必填位置参数:
= - 末尾的
args特殊参数:可接收0个及以上的剩余入参
- 第1个必填位置参数:
- Tcl规定,除末尾的
args外,参数列表里定义的所有位置参数都是必传项,调用时不能缺省。
你调用var part1时只传入了1个参数,缺少必填的第二个参数=,因此触发参数数量不匹配的报错。
如果想要实现“仅传变量名时取值、传变量名 = 任意内容时赋值”的效果,可以把参数列表改为仅保留args,自行解析入参内容,参考修改示例:
func var {args} { # 仅传1个参数时视为取值 if {[llength $args] == 1} { set varname [lindex $args 0] upvar $varname v return $v } # 符合 变量名 = 值 格式时赋值 if {[llength $args] >= 3 && [lindex $args 1] eq "="} { set varname [lindex $args 0] set value [lrange $args 2 end] upvar $varname v set v $value return $value } error "调用格式错误,支持格式:var varname 或 var varname = ?arg ...?" }
内容的提问来源于stack exchange,提问作者imolaig
相关产品推荐
相关产品推荐

