有一个 TCL 脚本具有多个名称相似的过程定义 func
在不同的命名空间中。程序如下所示:
proc func {a} {
puts $a
}
所有那种程序只有一个参数
a
.所有这些过程都是从整个脚本中的一行调用的:func $a
我需要创建另一个名称相似的过程定义
func
在其他命名空间中。但是该过程将有两个参数。该过程也需要从与其他具有相同名称的过程相同的行中调用。程序如下所示:proc func {a b} {
puts $a
puts $b
}
我现在需要修改调用所有程序的行
func $a
因此,它可以调用具有一个参数的所有过程和具有两个参数的新过程。但不得更改具有一个参数的程序定义。哪一行调用了所有这些程序 func $a
应该是什么样子?
最佳答案
如果你想要一个可选参数,并且你知道如果没有提供可选值应该是什么,你可以这样做:
proc func {a {b "the default"}} {
puts "a is $a"
puts "b is $b"
}
如果您需要在运行时计算默认值,最简单的技术是在实际输入中不太可能出现的魔法哨兵值。比如两个 ASCII NUL 字符(== Unicode U+000000):
proc func {a {b "\u0000\u0000"}} {
if {$b eq "\u0000\u0000"} {
set b "default:$a"
}
puts "a is $a"
puts "b is $b"
}
否则,你可以使用魔法
args
值来获取完整的参数列表并“手动”完成所有工作:proc func {a args} {
if {[llength $args] == 0} {
set b "the default..."
} elseif {[llength $args] == 1} {
set b [lindex $args 0]
} else {
error "bad number of arguments!"
}
puts "a is $a"
puts "b is $b"
}
如果你这样做,
info level
introspector 可以提供帮助,但事情可能会变得复杂......
关于带有可选参数的 TCL 过程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22931865/