- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有人可以解释为什么我可以在嵌套的 proc 中成功链接 upvars 的幕后细节,但它在嵌套的 TclOO 方法中不起作用(在子类中覆盖的那些方法)。 (有人告诉我,在 TclOO 类方法中调用 [next] 有点像“临时尾调用”,因为没有创建新的堆栈级别。是这种情况吗?如果是这样,完整的图片是什么?)
例如,以下三种方法并不都给出相同的结果:
proc addone {varname} {
upvar $varname x;
incr x;
}
proc addanotherone {varname} {
upvar $varname xx;
addone xx;
incr xx;
}
oo::class create C1 {
method addone {varname} {
upvar $varname x;
incr x;
}
}
oo::class create S1 {
superclass C1;
method addone {varname} {
upvar $varname xx;
next xx;
incr xx;
}
}
oo::class create S2 {
superclass C1;
method addone {varname} {
upvar $varname xx;
next $varname;
incr xx;
}
}
set s1 [S1 new];
set s2 [S2 new];
set y 1;
addanotherone y;
set y; # First result gives 3, as expected;
set y 1;
$s1 addone y;
set y; # gives 2, unexpected;
set y 1;
$s2 addone y;
set y; #gives 3, unexpected, because original varname seems to be "two levels" deep.
如果 [next] 以某种方式运行在相同的堆栈级别,它是否可以在没有“uplevel”的情况下在调用者范围内创建变量?
最佳答案
next
命令内部有点像 uplevel
(特别是 uplevel 1
)因为它 临时移除栈帧 方法调用 next
在运行父类(super class)实现时, next
时恢复堆栈帧返回(当然)。
这意味着您可以覆盖父类(super class)中的方法,而无需为这些父类(super class)特别准备。这是 Tcl 的其他一些旧对象系统的一个主要问题,您需要一个特殊调用来获取 upvar
的深度参数。和 uplevel
,而且很容易忘记这一点,所以我为 TclOO 改变了一些东西。但是,该更改的直接后果意味着您在 S1 » addone
中所做的事情不会工作;它创建/覆盖一个额外的变量,xx
, 在调用范围内。 S2 » addone
是我认为惯用的。
如果你在一个方法和它覆盖的方法之间传递一个内部变量——根据定义,这需要两者合作——使用对象状态命名空间中的变量;您的类(class)可以完全控制它。或者通过 my
调用一个方法或 [self]
;这是一个标准的方法调用(包括所有这些)。
关于tcl - upvar、TclOO 和 next -(可能)意外行为的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201923/
在我目前处理的 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 获胜。但在所有合理的情况下,这是预期的吗? 谢谢。 最佳答案 当
我是一名优秀的程序员,十分优秀!