使用命名参数调用TCL proc
鉴于这一过程:使用命名参数调用TCL proc,tcl,Tcl,鉴于这一过程: proc foo {{aa "a"} {bb "b"} cc} { echo $cc } 是否可以调用procfoo并只传递cc的值?另外,是否可以通过名称将值显式传递给cc 我所看到的一切都表明,所有参数都必须按位置传递。过程的参数都是按位置传递的。使用两个元素列表作为参数列表的组成部分,例如{aa a},是为了提供默认值。然而,正如手册所说: 具有默认值且后跟非默认参数的参数将成为必需参数。在8.6中,这将被视为错误 因此,大多数人在设计过程接口时,都会将提供默认值的参
proc foo {{aa "a"} {bb "b"} cc} {
echo $cc
}
是否可以调用procfoo
并只传递cc
的值?另外,是否可以通过名称将值显式传递给cc
我所看到的一切都表明,所有参数都必须按位置传递。过程的参数都是按位置传递的。使用两个元素列表作为参数列表的组成部分,例如
{aa a}
,是为了提供默认值。然而,正如手册所说:
具有默认值且后跟非默认参数的参数将成为必需参数。在8.6中,这将被视为错误
因此,大多数人在设计过程接口时,都会将提供默认值的参数放在参数列表的末尾
模拟命名参数的一种方法是将过程设计为获取单个参数,该参数是字典值,其中字典的键是参数的名称。比如说,
proc foo {a} {
if {[dict exists $a cc]} {
puts [dict get $a cc]
}
}
foo [dict create cc "this is the cc argument value"]
如果您不介意确定提供哪些可选参数和构建字典以调用过程的繁琐,那么您可以通过这种方式模拟命名参数,并在向过程提供参数方面实现一定的灵活性。我自己并不经常使用这种技巧。我发现更仔细地设计过程接口更容易。但有时情况需要做各种事情。我会像Tk那样做:
proc foo {cc args} {
# following will error if $args is an odd-length list
array set optional [list -aa "default a" -bb "default b" {*}$args]
set aa $optional(-aa)
set bb $optional(-bb)
puts "aa: $aa"
puts "bb: $bb"
puts "cc: $cc"
}
然后
%foo
错误#args:应为“foo cc…”
%富吧
aa:默认a
bb:默认值b
抄送:酒吧
%富吧-bb你好-aa世界
aa:世界
你好
抄送:酒吧
您可以使用类型shimming来避免构建dict..,这提供了一个有趣的简单直观的调用。将dict的列表表示形式传递给proc,例如:
proc foo {a} {
if {[dict exists $a cc]} {
puts [dict get $a cc]
}
}
foo {cc "this is the cc argument value" dd "this is the value of dd}
类似于这个问题:我会使用两个
数组集
如下:数组集可选{-aa“default a”-bb“default b”};数组集可选$args