在TCL中是否有任何包或任何特定方式来支持函数或过程重载?
这是我的情景.我需要编写一个接受两个或三个文件的通用程序,其中我可能有也可能没有第三个文件(File3)
proc fun { File1 File2 File3 }
{
}
proc fun { File1 File2 }
{
}
Run Code Online (Sandbox Code Playgroud)
tcl没有压倒一切.第二个声明将取代第一个声明.但是你用一个程序来处理它.至少有两种方式:
1)使用默认值指定最后一个参数.然后,当您调用该函数时,它将是可选的.
proc fun { file1 file2 {file3 ""} } {
if {$file3 != ""} {
# the fun was called with 3rd argument
}
}
Run Code Online (Sandbox Code Playgroud)
2)使用特殊参数args
,它将包含所有参数作为列表.然后分析实际传递给的参数的数量.
proc fun { args } {
if {[llength $args] == 3} {
# the fun was called with 3rd argument
}
}
Run Code Online (Sandbox Code Playgroud)
Tcl 并不真正支持过程重载,当您认为它本身并没有真正的类型时,这是有道理的。一切都是一个字符串,可以根据值解释为其他类型(int、list 等)。
如果您能描述您要完成的任务(为什么您认为需要重载),我们或许可以就如何完成任务提出建议。
鉴于对您的问题的编辑,有几种不同的方法可以解决。GrAnd 展示了其中的 2 个。第三个,也是我很喜欢的一个,是使用专门关于如何调用命令的信息:
proc fun { File1 File2 {File3 ""}} { ;# file3 has a default
if {[llength [info level 0]] == 3} { ;# we were called with 2 arguments
;# (proc name is included in [info level 0])
# do what you need to do if called as [fun 1 2]
} else { ;# called with 3 arguments
# do what you need to do if called as [fun 1 2 3]
}
}
Run Code Online (Sandbox Code Playgroud)