gpt4 book ai didi

tcl - 在TCL中,我们可以这样传递参数吗?

转载 作者:行者123 更新时间:2023-12-04 18:12:53 29 4
gpt4 key购买 nike

我对在 Tcl 中传递有关以下代码的参数有疑问:

set name "Ronaldo"

proc GET_PLAYER_INFO {player_id {player_name "$name"}} {
global name
puts $player_name
}

关于上面的代码,我们有一个全局变量“name”,并且在proc GET_PLAYER_INFO的参数列表中,参数player_name的默认值设置为“$name”?如果name的值为“ronaldo”,已经是双引号了,需要在参数列表中加双引号吗:player_name "$name"?而在我们执行“全局名称”命令之前,player_name的默认值是不是“罗纳尔多”?是这样,为什么我们需要在我们的 proc 中有“全局名称”命令?

最佳答案

就目前的情况而言,这是行不通的; $name根本不会被评估,所以默认将是那些文字的五个字符。

如果您在创建过程时绑定(bind)默认值,您可以这样做:

proc GET_PLAYER_INFO [list player_id [list player_name $name]] {
...
}

也就是说, proc 的参数只是普通的东西,你可以用 Tcl 命令和替换来构造。这是 Tcl 的一大优点。

但是,如果您想评估 $name在调用该过程时,您必须以不同的方式进行操作。如果您有某种永远不会用于玩家名称的值(例如,空字符串),那么这很容易:
proc GET_PLAYER_INFO {player_id {player_name ""}} {
if {$player_name eq ""} {
set player_name $::name
}
...
}

请注意,我在那里使用了完全限定的变量名。还有其他获得该名称的方法(例如,使用 global ,使用 upvar ,使用 variable ,...)

事情变得棘手的地方是当你根本没有合适的哨兵值时。此时,您必须查看实际提供了多少参数:
proc GET_PLAYER_INFO {player_id {player_name ""}} {
if {[llength [info level 0]] == 2} {
set player_name $::name
}
...
}

命令 info level 0将参数字的完整列表返回到当前过程调用。这包括 GET_PLAYER_INFO本身,并且在对上述定义的有效调用中是长度为 2 或 3 的列表。一旦列表可用,在 llength 中检查其长度是一项简单的练习。和数字比较。 (不过,使用哨兵值更容易,并且适用于 99.99% 的情况。)

最后的选择是使用特殊的 args形式参数并手动进行解析:
proc GET_PLAYER_INFO args {
if {[llength $args] < 1 || [llength $args] > 2} {
return -code error "wrong # args: should be \"GET_PLAYER_INFO player_id ?player_name?\""
}
set player_id [lindex $args 0]
if {[llength $args] > 1} {
set player_name [lindex $args 1]
} else {
set player_name $::name
}
...
}

如您所见,这是相当冗长的......

关于tcl - 在TCL中,我们可以这样传递参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736524/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com