无涯教程-Tcl - 命名空间

105 阅读1分钟

 Tcl 8.0版提供了命名空间(namespace),在引入名称空间之前,只有一个全局范围。现在有了名称空间,无涯教程有了全局范围的其他空间。

创建命名空间

命名空间是使用 namespace 命令创建的,创建命名空间的简单示例如下所示-

#!/usr/bin/tclsh

namespace eval MyMath { # 在命名空间内创建一个变量 variable myResult }

# 在命名空间内创建过程 proc MyMath::Add {a b } {
set ::MyMath::myResult [expr a</span><spanclass="pun">+</span><spanclass="pln">a </span><span class="pun">+</span><span class="pln"> b] } MyMath::Add 10 23

puts $::MyMath::myResult

执行以上代码后,将产生以下输出-

33

嵌套命名空间

Tcl允许嵌套名称空间。下面给出了嵌套名称空间的简单示例-

#!/usr/bin/tclsh

namespace eval MyMath { # 在命名空间内创建一个变量 variable myResult }

namespace eval extendedMath { # 在命名空间内创建一个变量 namespace eval MyMath { # 在命名空间内创建一个变量 variable myResult } } set ::MyMath::myResult "test1" puts </span><spanclass="pun">::</span><spanclass="typ">MyMath</span><spanclass="pun">::</span><spanclass="pln">myResult</span><spanclass="kwd">set</span><spanclass="pln"></span><spanclass="pun">::</span><spanclass="pln">extendedMath</span><spanclass="pun">::</span><spanclass="typ">MyMath</span><spanclass="pun">::</span><spanclass="pln">myResult</span><spanclass="str">"test2"</span><spanclass="pln">puts</span><span class="pun">::</span><span class="typ">MyMath</span><span class="pun">::</span><span class="pln">myResult </span><span class="kwd">set</span><span class="pln"> </span><span class="pun">::</span><span class="pln">extendedMath</span><span class="pun">::</span><span class="typ">MyMath</span><span class="pun">::</span><span class="pln">myResult </span><span class="str">"test2"</span><span class="pln"> puts ::extendedMath::MyMath::myResult

执行以上代码后,将产生以下输出-

test1
test2

导入和导出命名空间

您可以在前面的命名空间示例中看到,无涯教程使用了很多作用域解析运算符,并且使用起来更加复杂。可以通过导入和导出名称空间来避免这种情况。

#!/usr/bin/tclsh

namespace eval MyMath { # 在命名空间内创建一个变量 variable myResult namespace export Add }

# 在命名空间内创建过程 proc MyMath::Add {a b } {
return [expr a</span><spanclass="pun">+</span><spanclass="pln">a </span><span class="pun">+</span><span class="pln"> b] }

namespace import MyMath::* puts [Add 10 30]

执行以上代码后,将产生以下输出-

40

删除命名空间

您可以使用 forget 子命令删除导入的名称空间。一个简单的例子如下所示-

#!/usr/bin/tclsh

namespace eval MyMath { # 在命名空间内创建一个变量 variable myResult namespace export Add }

# 在命名空间内创建过程 proc MyMath::Add {a b } {
return [expr a</span><spanclass="pun">+</span><spanclass="pln">a </span><span class="pun">+</span><span class="pln"> b] } namespace import MyMath:: puts [Add 10 30] namespace forget MyMath::

执行以上代码后,将产生以下输出-

40

参考链接

www.learnfk.com/tcl-tk/tcl-…