我可以跳过在tcl中输入可选功能参数吗?

我可以跳过在tcl中输入可选功能参数吗?,tcl,Tcl,我知道我可以用可选的输入参数生成tcl函数。因此,如果您没有为这些参数输入值,它们可以采用您给它们的默认值。我的问题是,当我调用带有可选参数的函数时,是否可以跳过某些参数的输入而输入其他参数?例如,如果有2个可选参数,我如何为第二个参数而不是第一个参数输入值 我没有具体尝试过任何东西,因为我不知道如何解决这个问题 proc area { height width {normalization 1.0} {scaling 1.0} { .... } [area 3 4 3.5] 在输入缩放值

我知道我可以用可选的输入参数生成tcl函数。因此,如果您没有为这些参数输入值,它们可以采用您给它们的默认值。我的问题是,当我调用带有可选参数的函数时,是否可以跳过某些参数的输入而输入其他参数?例如,如果有2个可选参数,我如何为第二个参数而不是第一个参数输入值

我没有具体尝试过任何东西,因为我不知道如何解决这个问题

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
是过程的一个特殊形式参数,当它是最后一个参数时。它包含所有剩余参数的列表。我们可以把它重新解释为字典…