我在TCL中看到了一些这样的代码:
namespace eval ::info {
set count 0;
set id 1;
set role admin;
namespace export *
}
proc ::info::setcount {
set ::info::count 0;
}
proc ::info::setId {
set ::info::id 1;
}
proc ::info::setRole {
set ::info::role user;
}
命名空间::info中定义了三个变量,但是命名空间中没有声明三个procs(setcount setId setRole),好像是在::info之外定义的,这样可以吗?这是如何工作的?
最佳答案
过程定义在 ::info
命名空间中。它们只是不在 namespace eval
的范围内,该命令仅在必要时创建命名空间,然后在该上下文中执行给定的脚本。在命名空间的上下文中执行会改变 proc
在这些命令的名称不完全限定时放置它创建的命令的方式。命名空间独立于 namespace eval
调用而存在。
变量必须在命名空间中声明;这样就避免了解决可能引起人们注意的变量的一些非常讨厌的麻烦。
就个人而言,我更喜欢这样写代码:
namespace eval ::foo {
proc bar ... {
...
}
}
但我知道其他人不同意我的观点。写你喜欢的,因为 Tcl 对任何一种方案都适用。
关于namespaces - 如何在 tcl 命名空间中定义一个 proc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9667392/