你能帮助我如何使用我使用此函数的选项的参数但它不起作用
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'
我想调用类似
的函数my_proc 1 -args {u2 5} {u1 7}
my_proc 1 {u2 5} {u1 7} (required + optional arguments)
my_proc 1 (only required arguments)
答案 0 :(得分: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