在进行涉及创建和删除名称空间的一些探索时,我遇到了这种好奇心:
% namespace eval foo {variable x 1}
% namespace upvar foo x x
% set x
1
% namespace delete foo
% set x
can't read "x": no such variable
% set x 2
can't set "x": upvar refers to variable in deleted namespace
%
Run Code Online (Sandbox Code Playgroud)
在此之后,x
似乎是不可动摇的。无法读取或取消设置它,因为它不存在,但是因为它在另一个名称空间中而无法设置。如何x
从这种状态中恢复?
我要完成的工作是从另一个名称空间导入一组命令和变量,并能够删除该名称空间并使导入的命令和变量消失。 namespace delete
对于导入的命令来说似乎做得正确,但是导入变量没有等效项,据我所知,甚至没有任何方法可以确定某个特定变量是否(通过namespace upvar
)从其他地方导入了- namespace which
告诉您当前的名称空间,namespace origin
变量不存在。
(不是答案)
对我来说看起来像一个错误=> https://core.tcl-lang.org/tcl/tktnew
您也无法取消设置该变量。似乎你唯一能做的就是将upvar
其转换为不同的变量。
% namespace eval foo {variable x 1}
% namespace upvar foo x x
% namespace delete foo
% set x
can't read "x": no such variable
% set x 1
can't set "x": upvar refers to variable in deleted namespace
% unset x
can't unset "x": no such variable
% set tmp ""
% upvar 0 tmp x
% unset x
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
58 次 |
最近记录: |