gpt4 book ai didi

list - {*}在TCL中做什么?

转载 作者:行者123 更新时间:2023-12-04 05:34:25 25 4
gpt4 key购买 nike

我使用了一些TCL,但是这种结构使我感到困惑。

当$ res =“表不存在”时,以下内容将返回什么?

[list [list {*}$res]]

我知道 [list [list $res]]会做什么,但是多余的 {*}只会让我感到困惑。

感谢您的帮助。

最佳答案

When $res = "Table does not exist", what will the following return?

[list [list {*}$res]]

好吧,首先知道 [list {*}…]是一个返回省略号中的单词列表的结构(在您的情况下为 res变量的内容)。碰巧的是,在您的情况下,最终结果无济于事,因为输入字符串实际上也是格式良好的列表。然后,它成为外部 list的单个参数,因此我们得到一个单元素列表,其元素包含按顺序排列的单词 Tabledoesnotexist的列表,即 {Table does not exist}
扩充注意事项
扩展单词形式的列表对于列表的串联很有用。 concat命令执行类似的操作(但不完全相同; concat命令涉及一些历史怪异)。因此,您将这样连接两个列表:
set concatenation [list {*}$list1 {*}$list2]
另请注意,扩展(在Tcl 8.5中引入)是真正的语法,这在Tcl中是非常不寻常的事情。 {*}更改了以下替换的性质,以便产生多个单词,而不只是一个单词。尽管没有它是可能的,但实际上很难正确地做到这一点。例如,如果没有它,则将是:
set concatenation [eval [linsert $list1 0 list] [lrange $list2 0 end]]
扩展的引入极大地减少了大多数Tcl代码中对 eval的调用次数(这是一个好处,因为很难正确编写;很多程序员被这一困难所困扰)。实践证明,使用 exec命令特别有用。这使得使用 globauto_execok更加容易:
exec {*}[auto_execok $someCmd] $arg1 {*}[glob *.foo]
# Instead of:
#eval [linsert [auto_execok $someCmd] 0 exec] [linsert [glob *.foo] 0 $arg1]
# Or this _wrong_ version:
#eval exec [auto_execok $someCmd] $arg1 [glob *.foo]
啊。尽管我知道我在做什么,但最后一个弯折以非扩展形式写出来有点费劲。 (错误的版本是错误的,因为如果 $arg1包含Tcl元字符,它就会崩溃……)

关于list - {*}在TCL中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124185/

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