如何解决明显不一致的读/写变量
我刚刚在学习 Tcl。我只看过一点,我看到例如创建一个变量(并初始化它)你可以做
set varname value
我熟悉这样一个事实,即基本上所有东西都是一个字符串,例如上面的“值”,但是“varname”得到了一种特殊的待遇,我猜是因为“set”内置函数,所以 varname 不是解释为字符串而不是名称。 我稍后可以使用 $varname 访问该值,这对我来说很好,它用于指定 varname 不被视为字符串。 我现在正在阅读列表,一些命令让我有点困惑
set colors {"aqua" "maroon" "cyan"}
puts "list length is [llength $colors]"
lappend colors "purple"
很明显,“lappend”是另一个类似 set 的函数,它可以将第一个参数解释为名称而不是字符串,但是为什么它们不使它的 llength 相同(不需要 $)?
我认为这只是一个约定,一般来说,当你“读取”一个变量时,你需要 $ 而你不需要“写入”。
解决方法
对这个问题的不同看法:哪些 Tcl 命令适用于列表 literals?
计算列表文字的元素是有效的:
llength {my dog has fleas}
但是将新元素附加到文字中是没有意义的
lappend {my dog has fleas} and ticks
(这实际上是有效的 Tcl,但它设置了奇数变量 ${my dog has fleas}
)
这更明智:
set mydog {my dog has fleas}
lappend mydog and ticks
,
名称是字符串。 或者更确切地说,字符串是名称,因为它被用作名称。而 Tcl 中的 $
的意思是“立即读取这个变量”,不像在其他一些语言中它真正的意思是“这是一个变量名”。
用于从变量中读取的 $blah
语法是一种方便的语法,它大约代表执行 [set blah]
(只有一个参数)。对于简单的名字,它们变成了相同的字节码,但是 $…
形式不能像另一个那样处理所有奇怪的边缘情况(通常是生成的名字)。如果命令(例如 set
、lappend
、unset
或 incr
)采用变量名,那是因为它将写入该变量,并且通常是记录采用 varName (当然是变量名)或类似的东西。只是读取值的东西(例如,llength
或 lindex
)将直接获取值而不是变量的名称,并且由调用者使用他们想要的任何内容提供值,可能是 $blah
或 [call something]
。
特别是,如果您有:
proc ListRangeBy {from to {by 1}} {
set result {}
for {set x $from} {$x <= $to} {incr x $by} {
lappend result $x
}
return $result
}
那么你可以这样做:
llength [ListRangeBy 3 77 8]
和
set listVar [ListRangeBy 3 77 8]
llength $listVar
并从 llength
中获得完全相同的值。 llength
不需要知道正在发生的事情的任何特别之处。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。