【问题标题】:TCL proc for default value assignment用于默认值分配的 TCL proc
【发布时间】:2012-12-05 03:19:26
【问题描述】:

如果用户不提供任何参数,tcl 中的 proc 会自动接受参数的语法是什么?

我用过类似的东西

    proc a {{args 1}} {
    puts $args
    }

    a

当我使用它时,我将我的 args 值设为 1。它返回一个空白字符串。请帮我解决这个问题。

【问题讨论】:

    标签: tcl


    【解决方案1】:

    听起来你正在尝试一起做两件不同的事情:

    1. 接受可变数量的参数到您的过程
    2. 如果未提供参数,请使用默认值

    没有真正的 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
      

      【讨论】:

      • 谢谢!但如果我是对的,单独的“args”可以将值列表带到 proc。我对这个 proc 的输入来自另一个 proc,它可以提供任意数量的参数。如何处理?
      • 例如 a 1 2 3 4 5 仅在使用 args 时才有效。
      • 当前的过程实现以严格的从左到右的方式将实际参数分配给形式参数。这意味着没有理由在没有另一个正式参数之前将默认值放在一个形式参数上;这将被忽略(并导致可能令人困惑的错误消息)。此外,args 仅在它是最后一个形式参数时才特别;在其他任何地方,这只是普通的正式场合。
      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      相关资源
      最近更新 更多