proc foo {param} {
namespace eval foo_ns {
uplevel {set foo_ns::x $param }
}
}
这看起来很难看。
[upvar]不起作用,因为它无法链接到'param'。
感谢。
答案中的代码不起作用(tclsh8.4)
% proc bar {param} {
namespace eval foo_ns {
uplevel [list set foo_ns::x $param]
}
}
% bar 123
can't read "param": no such variable
% proc foo {param} {
set ::foo_ns::x $param
}
% foo 123
can't set "::foo_ns::x": parent namespace doesn't exist
答案 0 :(得分:4)
有什么问题:
proc foo {param} {
set ::foo_ns::x $param
}
在我的测试中,似乎达到了同样的目标。
更新:感谢K0re指出这一点。在调用foo之前,您需要定义名称空间:
namespace eval ::foo_ns {}
答案 1 :(得分:2)
命名空间和级别是两回事。你不需要升级这个问题。
这是一个创建命名空间并将变量设置在一行中的简单解决方案:
proc foo {param} {
namespace eval ::foo_ns [list set x $param]
}
答案 2 :(得分:1)
好的,你有两个不同的问题。首先是命名空间尚不存在;第二个是你需要编写代码,以便在该命名空间中创建/写入变量。总的来说,这只需要修改Hai的代码:
proc foo {param} {
# Create the namespace if it doesn't already exist
namespace eval ::foo_ns {}
# Set the variable in the namespace
set ::foo_ns::x $param
}
作为对您遇到的一些问题的评论:
proc foo {param} {
namespace eval foo_ns {
uplevel {set foo_ns::x $param }
}
}
这不起作用,因为您实际上是这样说的: 在命名空间“foo_ns”中,运行以下代码: 在堆栈的顶层,敲响以下代码: “set foo :: x $ param”
但是,在堆栈的顶层,变量“param”没有值(它只在过程中定义。你需要确保它事先被替换。我会包含可以工作的代码但是老实说,我担心它会引起对这个问题的实际答案的混淆......所以我会把它留下来。