Tcl跨proc访问全局变量提示变量不存在的解决方法
Tcl跨过程访问全局变量的正确实现方式
Tcl中过程(proc)默认拥有独立的局部作用域,过程内直接写变量名时,Tcl只会查找当前过程的局部变量,不会自动访问全局作用域的变量,这是之前两种写法报错的核心原因。
错误原因说明
之前的两种写法都只在赋值变量的过程里做了全局变量关联,读取变量的过程没有做对应关联:
- 第一种
set ::name赋值的写法:myname2里读取用的是$name,没有指定全局命名空间,Tcl会查找不存在的局部变量name触发报错 - 第二种
global name声明的写法:只在myname里做了全局声明,myname2里没有加同样的声明,同样会查找不存在的局部变量触发报错
两种正确实现方案
方案1:用global命令统一声明
所有需要读写该全局变量的过程内,都先用global 变量名声明,将过程内的同名变量指向全局作用域的变量,之后直接用变量名读写即可。
proc myname {} { global name set name [gets stdin] } proc myname2 {} { global name puts "your name is: $name" }
方案2:用全局命名空间绝对路径访问
Tcl全局变量存放在根命名空间::下,所有读写操作都显式带上::前缀指定变量路径,就不需要额外写global声明,Tcl会直接操作全局变量。
proc myname {} { set ::name [gets stdin] } proc myname2 {} { puts "your name is: $::name" }
运行验证
按上述任意一种写法修改后,按顺序调用过程即可达到预期效果:
% myname Jhon % myname2 your name is: Jhon
注意:必须先调用
myname完成变量赋值,再调用myname2读取,否则还是会出现变量不存在的报错。
内容的提问来源于stack exchange,提问作者YaGaRa12
相关产品推荐
相关产品推荐

