2017-07-14 241 views
1

一个新的字典,我想编写一个PROC它可以接受字典作为optional argument或者如果没有被赋予新创建的。我的尝试,但是,失败如何设置默认值的参数proc是Tcl的

的说法符太多的领域 “词典[字典创建]”

proc getOpts { {dictionary [dict create]} } { 
    upvar $dictionary dct 
    for { set i 0 } { $i < $::argc } { incr i } { 
     set key [lindex $::argv $i] 
     if { [string index $key 0] == "-" } { 
      incr i 
      dict set dct [string trimleft $key "-"] [lindex $::argv $i] 
     } else { 
      dict set dct $key "" 
     } 
    } 
} 

由于dictionaries are pure values,我想这可能是工作。看起来我可能错了。不过,我想知道为什么它不起作用。

+0

只需使用{}。但你的upvar不会工作。 –

回答

1

它不起作用的原因是参数变量列表是一个真正的列表,而不是一个命令评估上下文。这意味着[dict create]被解析为两个单独的词,并且proc不喜欢那样。幸运的是,没有其他参数的dict create仅仅是表示空字符串的另一种方式:使用{}""代替。

更大的问题是,你用upvar;你可能不想这样做。正确的做法可能是不做变量绑定,而只是从过程中返回字典:调用者可以将它保存在它自己的一个变量中,如果它关心的话。

+0

感谢您的解释。所以如果'proc'有一个可选参数,我不能用它传递信息给调用者,因为我不能对它做'upvar',对吧? –

+1

@Tao先生:1)通过返回值,您可以在任何情况下将信息传回给调用者。 2)它不是引起'upvar'问题的可选参数值:问题是'upvar'的参数(在可选级别参数之后)需要是变量名称。 –

+0

@PeterLewerin By _it_我一直在引用可选参数,而不是'proc'本身。 –