如何在proc中声明可选参数

时间:2013-12-05 11:06:17

标签: tcl

你能帮助我如何使用我使用此函数的选项的参数但它不起作用

proc {my_proc} {n1 n2 -args{{u2 "5"} {u1 "5"}} } {

puts "n1:'$n1', n2:'$n2', u1:'$u1', u2:'$u2'"
}

->my_proc 1 -args 5 7
n1:'1', n2:'$n2', u1:'7', u2:'5'

我想调用类似

的函数
  1. my_proc 1 -args {u2 5} {u1 7}
  2. my_proc 1 {u2 5} {u1 7} (required + optional arguments)
  3. my_proc 1 (only required arguments)

2 个答案:

答案 0 :(得分:3)

强烈建议 在特定命令中仅使用其中一种模式:

  1. 可选参数,其中optional-ness是按位置。
  2. 可选的键值对。
  3. 将两者结合起来相对难以做到,而且总是相当混乱!

    按职位选择

    proc my_proc {n1 n2 {u2 "5"} {u1 "5"}} {
        puts "n1:'$n1', n2:'$n2', u1:'$u1', u2:'$u2'"
    }
    my_proc 7 8 9
    #### n1:'7', n2:'8', u1:'5', u2:'9'
    

    按键值对的选项

    proc my_proc {n1 n2 args} {
        # Add the defaults
        set args [dict merge {-u1 5 -u2 5} $args]
        # Magic! (Keys start with “-” by arbitrary convention.)
        # Copies from the value for key “-u1” to $u1 (and similarly “-u2”/$u2)
        # The empty value is an update script; empty here as we don't want to update
        dict update args  -u1 u1  -u2 u2  {}
    
        # Use...
        puts "n1:'$n1', n2:'$n2', u1:'$u1', u2:'$u2'"
    }
    my_proc 7 8 -u1 123 -u2 456
    #### n1:'7', n2:'8', u1:'123', u2:'456'
    

    还有其他一些方法可以做到这一点,例如dict set options $args;puts $options(-u1)。这些在Tcl 8.4中特别有用(之前,对于真正落后的时代):

    proc my_proc {n1 n2 args} {
        # Defaults
        array set opt {-u1 5 -u2 5}
        # Parse
        array set opt $args
        # Use
        puts "n1:'$n1', n2:'$n2', u1:'$opt(-u1)', u2:'$opt(-u2)'"
    }
    my_proc 7 8 -u1 123 -u2 456
    #### n1:'7', n2:'8', u1:'123', u2:'456'
    

答案 1 :(得分:0)

正如Donal建议的那样,我喜欢使用args和一个数组来处理选项。它允许一种简单的方法来设置默认值:

proc p {args} {
    array set options {-u1 defU1 -u2 defU2}  ;# the default values
    array set options $args                  ;# merge the user's values
    parray options
}
p -foo bar -u1 42
options(-foo) = bar
options(-u1)  = 42
options(-u2)  = defU2

您需要检查$ args是否包含偶数个元素:

% p 1 2 3
list must have an even number of elements