- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我目前处理的 TCL 代码中,每个过程中的参数都被 upvar
'ed 到一个局部变量,可以这么说,然后使用。像这样的:
proc configure_XXXX { params_name_abc params_name_xyz} {
upvar $params_name_abc abc
upvar $params_name_xyz xyz
}
从这里开始,abc 和 xyz 将被用来做任何事情。我读了upvar TCL wiki但无法理解优点。我的意思是为什么我们不能只使用已收到的变量作为过程中的参数。谁能详细说明一下?
最佳答案
I mean why cant we just use the variables that have been received as the arguments in the procedure.
你可以。它只是变得烦人。
通常,当您将变量的 name 传递给命令时,命令可以修改该变量。这方面的经典例子是 set
和 incr
命令,这两个命令都将变量的名称作为第一个参数。
set thisVariable $thisValue
您也可以对过程执行此操作,但是当变量是在过程调用者的上下文中定义的变量时,您需要从过程的上下文访问该变量,该变量可能是命名空间或可能是一个不同的局部变量框架。为此,我们通常使用 upvar
,它将一个局部变量的别名设置为另一个上下文中的变量。
例如,这里是 incr
的重新实现:
proc myIncr {variable {increment 1}} {
upvar 1 $variable v
set v [expr {$v + $increment}]
}
为什么写入局部变量 v
会导致调用者上下文中的变量被更新?因为我们给它起了别名(在内部,它是通过一个指向另一个变量的存储结构的指针来设置的;一旦 upvar
完成它就会非常快)。 global
和 variable
使用相同的底层机制;它们都归结为快速变量别名。
如果你使用 uplevel
代替,你可以不这样做,但这会变得相当烦人:
proc myIncr {variable {increment 1}} {
set v [uplevel 1 [list set $variable]]
set v [expr {$v + $increment}]
uplevel 1 [list set $variable $v]
}
太恶心了!
或者,假设我们根本没有这样做。然后我们需要通过它的值传递变量,然后分配结果:
proc myIncr {v {increment 1}} {
set v [expr {$v + $increment}]
return $v
}
# Called like this
set foo [myIncr $foo]
有时是正确的,但工作方式完全不同!
Tcl 的核心原则之一是您可以使用标准库命令(例如 if
或 puts
或 incr
) 也可以使用您自己编写的命令来完成。没有关键字。自然可能存在一些效率问题,并且某些命令可能需要用另一种语言(例如 C)完成才能正常工作,但语义不会使任何命令特别。它们全部只是简单的命令。
关于tcl - upvar 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506914/
在我目前处理的 TCL 代码中,每个过程中的参数都被 upvar'ed 到一个局部变量,可以这么说,然后使用。像这样的: proc configure_XXXX { params_name_abc p
想听取 TCL 专业人士的建议以获得最佳实践。 假设您想使用 proc 构造一个包含特定数据的列表。现在哪个是最好的方法? proc processList { myList } { upvar
我对 TCL 中的 upvar 命令有疑问。使用 upvar 命令,我们可以在其他过程中引用全局变量或局部变量。我看到了以下代码: proc tamp {name1 name2} { upva
我正在尝试创建一个简单的程序,其中包含一个包含逐渐清空自身的集合的闭包: fn main() { let vector = vec![1, 2, 3]; let mut allow_o
我想知道是否有人可以解释为什么我可以在嵌套的 proc 中成功链接 upvars 的幕后细节,但它在嵌套的 TclOO 方法中不起作用(在子类中覆盖的那些方法)。 (有人告诉我,在 TclOO 类方法
根据规范/实现,访问命名空间变量与 upvar 之间是否存在预期差异。 我必须使用回调函数。我不能只是传递一个论点。经验上,upvar 获胜。但在所有合理的情况下,这是预期的吗? 谢谢。 最佳答案 当
我是一名优秀的程序员,十分优秀!