我有下面的虚拟程序,
proc main2 {} {
set mainVar 100
proc subproc1 {} {
puts $mainVar
}
subproc1
}
main2
它抛出一个错误无法读取"mainVar":没有这样的变量。 我的问题是,如果我在 proc 中声明一个变量(即 mainVar(,该变量不应该在该进程内的任何地方都可以访问吗? 为什么它不能在 mainproc 进程中声明的另一个进程中访问? 请对此有所了解
Tcl 的过程不嵌套;根本没有共享范围。在另一个过程中声明一个过程的主要原因是,如果你在外部过程中进行某种代码生成(无论是名称、变量列表还是主体(。
现在,您可以模拟这样的只读版本(简化版本;全服务变体要复杂得多(:
proc closure {name arguments body} {
set vars [uplevel 1 {info locals}]
set prologue {}
foreach v $vars {
upvar 1 $v var
append prologue [list set $v $var] ";"
}
uplevel 1 [list proc $name $arguments $prologue$body]
}
proc main2 {} {
set mainVar 100
closure subproc1 {} {
puts $mainVar
}
subproc1
}
main2
我将把使用global
和数组(以及正确完成这项工作的所有其他细微差别(使其正常工作作为读者的练习。