使用命名参数调用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
}
是否可以调用proc
foo
并只传递
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