带有可选参数的 TCL 过程调用

标签 tcl

有一个 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/

相关文章:

python - 提高 Tkinter 文本的 Pygments 语法突出显示速度

namespaces - TCL 命名空间和来源

if-statement - 如何在 if 语句中使用 expr?

string - 如何避免 Tcl 字符串中的命令替换?

TCL - 返回变量与 upvar 并修改

tcl - 从 TCL 中的字符串中提取整数

c++ - 如何修改 ns2 模拟器中节点的行为?

linux - Tcl 如何在此脚本中显示名称?

recursion - Tcl - 递归遍历和FTP上传

linux - 期望脚本的错误退出状态