首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表观不一致性读/写变量

表观不一致性读/写变量
EN

Stack Overflow用户
提问于 2021-01-21 16:22:07
回答 2查看 51关注 0票数 0

我刚刚在了解Tcl。我只看到了一些,例如创建一个变量(并初始化它),您可以这样做

代码语言:javascript
复制
    set varname value

我正在熟悉这样一个事实:基本上所有东西都是字符串,比如上面的"value“,但是" varname”得到了一种特殊的待遇--我猜是因为"set“内置函数,所以varname被解释为一个字符串,而是一个名称。稍后我可以使用$varname访问该值,这对我来说很好,它用于指定varname不被视为字符串。我现在正在读关于列表和几个命令的文章,这让我有点困惑

代码语言:javascript
复制
    set colors {"aqua" "maroon" "cyan"}
    puts "list length is [llength $colors]"
    lappend colors "purple"

很明显,"lappend“是另一个类似set的函数,它可以将第一个参数解释为名称,而不是字符串,但是为什么它们不使其长度相同(不需要$)?

我认为这只是一个惯例,一般情况下,当你“读”一个变量时,你需要$,而不是“写”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-21 17:27:32

名字是字符串。或者更确切地说,字符串是一个名称,因为它被用作名称。而$在Tcl中的意思是“立即读取此变量”,而在其他一些语言中,它真正的意思是“这里是变量名”。

从变量中读取的$blah语法是一种方便的语法,它大约是用来执行[set blah]的(只有一个参数)。对于简单的名称,它们成为相同的字节码,但是$…表单不能处理所有奇怪的边缘情况(通常使用生成的名称)。如果命令(如setlappendunsetincr)使用变量名,这是因为它将写入该变量,并且通常会记录为使用varName (当然是变量名)或类似的东西。刚刚读取值的东西(例如,llengthlindex)将直接使用值,而不是变量的名称,而由调用方使用他们想要的值(可能是$blah[call something] )来提供值。

特别是,如果你有:

代码语言:javascript
复制
proc ListRangeBy {from to {by 1}} {
    set result {}
    for {set x $from} {$x <= $to} {incr x $by} {
        lappend result $x
    }
    return $result
}

然后你就可以:

代码语言:javascript
复制
llength [ListRangeBy 3 77 8]

代码语言:javascript
复制
set listVar [ListRangeBy 3 77 8]
llength $listVar

并从llength中获取完全相同的值。llength不需要知道发生了什么特别的事情。

票数 1
EN

Stack Overflow用户

发布于 2021-01-21 19:59:47

另一个问题是:哪些Tcl命令适合于列表文本

计算列表文本的元素是有效的:

代码语言:javascript
复制
llength {my dog has fleas}

但是在文字中添加一个新元素是没有意义的

代码语言:javascript
复制
lappend {my dog has fleas} and ticks

(这实际上是有效的Tcl,但它设置了奇数变量${my dog has fleas})

这样做更明智:

代码语言:javascript
复制
set mydog {my dog has fleas}
lappend mydog and ticks
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65831542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档