- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 TCL 中的 upvar 命令有疑问。使用 upvar 命令,我们可以在其他过程中引用全局变量或局部变量。我看到了以下代码:
proc tamp {name1 name2} {
upvar $name1 Ronalod
upvar $name2 Dom
set $Dom "Dom"
}
tamp name1 name2
,并且没有在它之外定义全局变量 name1、name2,这个 upvar 在这种情况下是如何工作的?
最佳答案
当你调用 upvar 1 $foo bar
时,它会在调用者的作用域中找到名称在 foo
变量中的变量,并将本地变量 bar
变成它的别名。如果变量不存在,则在未设置状态下创建它(即,变量记录存在但没有值。实际上,实现使用 NULL
来表示该信息,这就是为什么 Tcl 没有 NULL
等价物; NULL
表示不存在)但仍会创建链接。 (只有当局部作用域被破坏或使用 upvar
将局部变量指向其他东西时,它才会被拆除。)
所以让我们看看你的代码到底在做什么:
proc tamp {name1 name2} {
upvar $name1 Ronalod
upvar $name2 Dom
set $Dom "Dom"
}
tamp
作为过程的命令,该过程将有两个强制性的形式参数,并且这些参数称为
name1
和
name2
。
1
级别指示符是可选的,但在惯用代码中强烈建议使用),它由
name1
变量(即过程的第一个参数)给出) 到局部变量
Ronalod
。此后,对该局部变量的所有访问(直到堆栈帧生命周期结束)实际上都将在调用者中的绑定(bind)变量上执行。
name2
(第二个参数)和
Dom
(局部变量)。
Dom
变量以获取变量名(即,在过程调用的第二个参数中命名的变量)并将该命名变量设置为值
Dom
。请记住,在 Tcl 中,您使用
$
来读取变量,而不是谈论变量。
Dom
自
set
产生变量的内容作为其结果,它刚刚分配的值)。 (最后一行完全没意思,因为它只是程序主体的结尾。)
Ronalod
或
Dom
的变量。这很令人困惑。当然,令人困惑的地方实际上是带有可变第一个参数的时髦的
set
。 (这几乎总是一个坏主意;它是不良代码气味的一个指标。)如果您改用它,事情会更简单:
set Dom "Dom"
Dom
耦合的变量(即过程的第二个参数命名的变量)将设置为
Dom
;这些变量实际上是通过引用传递的。额外的
$
有很大的不同!
关于tcl - upvar 命令在 TCL 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11047931/
在我目前处理的 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 获胜。但在所有合理的情况下,这是预期的吗? 谢谢。 最佳答案 当
我是一名优秀的程序员,十分优秀!