我可以跳过在tcl中输入可选功能参数吗?
我知道我可以用可选的输入参数生成tcl函数。因此,如果您没有为这些参数输入值,它们可以采用您给它们的默认值。我的问题是,当我调用带有可选参数的函数时,是否可以跳过某些参数的输入而输入其他参数?例如,如果有2个可选参数,我如何为第二个参数而不是第一个参数输入值 我没有具体尝试过任何东西,因为我不知道如何解决这个问题我可以跳过在tcl中输入可选功能参数吗?,tcl,Tcl,我知道我可以用可选的输入参数生成tcl函数。因此,如果您没有为这些参数输入值,它们可以采用您给它们的默认值。我的问题是,当我调用带有可选参数的函数时,是否可以跳过某些参数的输入而输入其他参数?例如,如果有2个可选参数,我如何为第二个参数而不是第一个参数输入值 我没有具体尝试过任何东西,因为我不知道如何解决这个问题 proc area { height width {normalization 1.0} {scaling 1.0} { .... } [area 3 4 3.5] 在输入缩放值
proc area { height width {normalization 1.0} {scaling 1.0} {
....
}
[area 3 4 3.5]
在输入缩放值时,是否有一种方法可以在不更改规范化默认值的情况下调用area
如果我想要一个3.5的缩放值,如果不输入一个标准化值,我就无法真正输入它。是的,这是正确的;如果希望缩放值为3.5,则必须输入一个值,以便按照编写
proc
的方式进行规范化
你可以对你想要做的事情做一些调整(有一个整体)。一个包含数组的快速示例
:
proc area {height width args} {
# Put the remaining parameters in an array, you might want to do validation checks before that
array set options $args
# If certain parameters are not provided, give default values
if {"-normalization" ni [array names options]} {
set options(-normalization) 1.0
}
if {"-scaling" ni [array names options]} {
set options(-scaling) 1.0
}
puts "Normalization: $options(-normalization)"
puts "Scaling: $options(-scaling)"
}
area 1 2 -normalization 3.5
# => Normalization: 3.5
# => Scaling: 1.0
area 1 2 -scaling 3.5
# => Normalization: 1.0
# => Scaling: 3.5
area 1 2
# => Normalization: 1.0
# => Scaling: 1.0
我使用的模式是:
proc area {height width args} {
# The default values
set defaults {-normalization 1.0 -scaling 1.0}
# Merge with the actual arguments provided
set params [dict merge $defaults $args]
# Just extract the variables I care about using [dict update] with an empty body
dict update params -normalization norm -scaling scale {}
# Demonstrate what's been extracted
puts "Parameters: $height $width $norm $scale"
}
area 2 3 -scaling 17.3
这并不完美,因为它不会对意外参数发出警告/出错,不会提供发现机制,也不会处理参数名称缩写,但它简单、便宜且速度相当快。有人提出了改变这一现状的建议(我知道有两个建议:,),但迄今为止,还没有一个真正获得了成功;这是一个在灵活性和性能之间微妙妥协的领域
(如果使用变量名作为实际参数名,并且根本不关心错误的参数,则可以使用dict with
进行提取。)
较短的版本(使用相同的基本思想)可能是:
proc area {height width args} {
array set {} [dict merge {-normalization 1.0 -scaling 1.0} $args]
puts "Parameters: $height $width $(-normalization) $(-scale)"
}
这将使用名称为空的变量作为数组。是的,这是合法的(而且相对方便),但我自己从来没有真正喜欢过
有人建议改变这种情况(我知道有两个建议:
但迄今为止,还没有一家真正获得了吸引力
如果您愿意使用已建立的Tcl扩展(),那么在实现过程时,您可以从可选的命名参数中获益:
package req nsf
nsf::proc area {height width {-normalization 1.0} {-scaling 1.0}} {
puts "arguments: $height $width $normalization $scaling"
}
area 1 2 -normalization 3.5
# arguments: 1 2 3.5 1.0
area 1 2 -scaling 3.5
# arguments: 1 2 1.0 3.5
area 1 2
# arguments: 1 2 1.0 1.0
关键是args
是过程的一个特殊形式参数,当它是最后一个参数时。它包含所有剩余参数的列表。我们可以把它重新解释为字典…