如果用户不提供任何参数,tcl 中自动接受参数的 proc 的语法是什么?
我用过类似的东西
proc a {{args 1}} {
puts $args
}
a
当我使用它时,我将我的 args 值设为 1。它返回一个空白字符串。请帮我解决一下这个。
如果用户不提供任何参数,tcl 中自动接受参数的 proc 的语法是什么?
我用过类似的东西
proc a {{args 1}} {
puts $args
}
a
当我使用它时,我将我的 args 值设为 1。它返回一个空白字符串。请帮我解决一下这个。
听起来你正试图一起做两件不同的事情:
proc 并没有专门处理这种情况的语法。但是,它很容易实现。您可以接受可变数量的参数(args
关键字),然后检查是否提供了任何参数(如果没有,则使用默认值)。
proc myproc {args} {
if { [llength [info level 0]] < 2 } { #called with no args
set args {the default list of values}
}
# rest of the code goes here
}
该info level 0
命令返回调用时正在运行的实际命令,并带有参数。因此,如果它的结果长度 < 2,我们知道当前命令是在没有参数的情况下调用的(因为列表中的第一个元素是实际的命令名称本身)。
该词args
是保留字,在 proc 定义中具有特定含义。使用不同的变量名:
proc a {{x 1}} {
puts $x
}
a
在 proc 定义中,通过将参数定义为具有两个成员的列表来给出默认值:第一个是参数的名称,第二个是默认值。
这个词args
是一个特殊的参数,它实现了剩余参数(也就是说,它捕获了参数列表中没有指定的剩余参数)。这就是在 Tcl 中实现可变参数函数的方式。
定义过程时,args
参数和默认值可以一起使用。但args
不能有默认值。之前列出的任何参数args
都可以具有默认值。但是具有默认值的参数必须列在没有默认值的参数之后。所以,基本上你可以写一个这样的函数:
proc a {x {y 1} args} {
puts "$x $y ($args)"
}
a 1 ;# prints 1 1 ()
a 1 2 ;# prints 1 2 ()
a 1 2 3 4 ;# prints 1 2 (3 4)
如果您的用例符合此模式,那么您可以像上面的示例一样使用默认值定义参数args
。如果没有,那么您唯一的选择是args
自己处理:
# Assume parameters are key-value pairs,
# if value not given then default to 1
proc b args {
foreach {x y} $args {
if {$y == ""} { set y 1 }
puts "$x -> $y"
}
}
b 1 2 ;# prints 1 -> 2
b 1 2 3 ;# prints 1 -> 2, 3 -> 1