namespaces - 如何在 tcl 命名空间中定义一个 proc

标签 namespaces tcl proc

我在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/

相关文章:

Ruby - &prc 与 &block 不同吗?

ruby - 如何将方法或 lambda 转换为非 lambda proc

typescript - 在自定义定义中引用全局声明的命名空间类型

python - `__import__(' pkg_resources').declare_namespace(__name__)` 有什么作用?

escaping - 用于将其放入 TCL 中的正则表达式的转义字符串

ubuntu - 为什么使用 'source' 运行 TCL 脚本会报错?

c - 如何计算旧内核上的自愿上下文切换

C#:属性/字段命名空间歧义

c# - 我应该停止与 Visual Studio 的默认命名空间命名约定作斗争吗?

c++ - 如何将以微秒为单位的纪元时间转换为可读格式