有一个 TCL 脚本,它func在不同的命名空间中有多个具有相似名称的过程定义。程序如下所示:
proc func {a} {
puts $a
}
Run Code Online (Sandbox Code Playgroud)
所有那种程序只有一个参数a。所有这些类型的过程都是从整个脚本的一行中调用的:
func $a
Run Code Online (Sandbox Code Playgroud)
我需要func在其他命名空间中创建另一个具有相似名称的过程定义。但该过程将有两个参数。该过程也需要从与其他同名过程相同的行调用。程序如下所示:
proc func {a b} {
puts $a
puts $b
}
Run Code Online (Sandbox Code Playgroud)
我现在需要修改调用所有这些过程的行,func $a以便它可以调用所有具有一个参数的过程和具有两个参数的新过程。但是不能更改带有一个参数的过程定义。调用所有这些程序的行func $a应该是什么样的?
Don*_*ows 10
如果你想要一个可选参数,并且你知道如果没有提供可选值应该是什么,你可以这样做:
proc func {a {b "the default"}} {
puts "a is $a"
puts "b is $b"
}
Run Code Online (Sandbox Code Playgroud)
如果您需要在运行时计算默认值,最简单的技术是在实际输入中不太可能出现的魔法哨兵值。比如两个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"
}
Run Code Online (Sandbox Code Playgroud)
否则,您可以使用魔法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"
}
Run Code Online (Sandbox Code Playgroud)
如果你这样做,info level内省者可以提供帮助,但事情可能会变得复杂......
| 归档时间: |
|
| 查看次数: |
9240 次 |
| 最近记录: |