【问题标题】:how to define a proc in tcl namespace如何在 tcl 命名空间中定义一个 proc
【发布时间】:2012-03-12 12:55:23
【问题描述】:

我在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之外定义的,这样可以吗?这是如何工作的?

【问题讨论】:

    标签: namespaces tcl proc


    【解决方案1】:

    过程::info 命名空间中定义。它们只是不在namespace eval 的范围内,该命令仅在必要时创建命名空间,然后在该上下文中执行给定的脚本。在命名空间的上下文中执行会改变proc 在这些命令的名称不完全限定时放置它创建的命令的方式。命名空间独立于namespace eval 调用而存在。 变量必须在命名空间中声明;这避免了在解决可能引起人们注意的变量方面的一些真正令人讨厌的麻烦。

    就个人而言,我更喜欢这样写代码:

    namespace eval ::foo {
        proc bar ... {
            ...
        }
    }
    

    但我知道其他人不同意我的观点。写你喜欢的,因为 Tcl 对任何一种方案都适用。

    【讨论】:

    • 但是命令命名空间 eval 到底在做什么?它是我们声明的命名空间的一部分吗?
    • @ratzip 它完全这样做:如果命名空间尚不存在,则创建命名空间,评估该命名空间中的脚本(这涉及为评估的跨度推送一种特殊类型的堆栈框架)。
    【解决方案2】:

    namespace eval 命令

    1. 如果命名空间不存在则创建它
    2. 运行从该命名空间内提供给它的代码

    在命名空间中定义的过程(所有过程都是过程,因为默认命名空间是 ::)

    • 如果前面有绝对命名空间,将在指定的命名空间中定义该命令
    • 如果前面有相对命名空间,将定义相对于当前命名空间的命令

    这样

    namespace eval bob {
        namespace eval joe {
            proc proc1 {} {}
        }
        proc proc2 {} {}
        proc ::proc3 {} {}
        proc joe::proc4 {} {}
    }
    proc proc5 {} {}
    proc bob::joe::proc6 {} {}
    proc ::bob::joe::proc7 {} {}
    

    以下命令将存在

    ::bob::joe::proc1
    ::bob::proc2
    ::proc3
    ::bob::joe::proc4
    ::proc5
    ::bob::joe::proc6
    ::bob::joe::proc7
    

    请注意,从全局命名空间调用全局命名空间中的命令时,可以在前面加上::,也可以不加::。任何命名空间中的命令也是如此。

    namespace eval bob {
        proc2 ;# calls ::bob::proc2
        ::proc5 ;# calls ::proc5 (proc5 in the global namespace)
        joe::proc4 ;# calls ::bob::joe::proc4
    }
    

    值得注意的是,原始命令名称(根本没有命名空间限定符)将在当前命名空间中查找,然后如果在那里找不到该命令,则在全局命名空间中查找。

    namespace eval bob {
        proc5 ;# calls ::proc5 since there is no ::bob::proc5
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多