名称空间是一个容器组标识符,用于组变量和程序。命名空间可从Tcl 8.0版开始使用。引入命名空间之前,有一个全局范围。现在有了命名空间,我们可以分区全局范围。
使用命名空间命令创建命名空间。一个简单的例子,创建命名空间如下图所示
#!/usr/bin/tclsh namespace eval MyMath { # Create a variable inside the namespace variable myResult } # Create procedures inside the namespace proc MyMath::Add {a b } { set ::MyMath::myResult [expr $a + $b] } MyMath::Add 10 23 puts $::MyMath::myResult当执行上面的代码,产生以下结果:
33
在上面的程序,可以看到有一个变量myResult和程序Add的一个命名空间。这使得创建变量和程序可根据相同的名称在不同的命名空间。
TCL允许命名空间的嵌套。一个简单的例子,嵌套的命名空间如下。
#!/usr/bin/tclsh namespace eval MyMath { # Create a variable inside the namespace variable myResult } namespace eval extendedMath { # Create a variable inside the namespace namespace eval MyMath { # Create a variable inside the namespace variable myResult } } set ::MyMath::myResult "test1" puts $::MyMath::myResult set ::extendedMath::MyMath::myResult "test2" puts $::extendedMath::MyMath::myResult
当执行上面的代码,产生以下结果:
test1 test2
可以在前面的例子命名空间看到,我们使用了大量的作用范围解决运算符,它们的使用变得更复杂。我们可以通过导入和导出命名空间避免这种情况。下面给出一个例子。
#!/usr/bin/tclsh namespace eval MyMath { # Create a variable inside the namespace variable myResult namespace export Add } # Create procedures inside the namespace proc MyMath::Add {a b } { return [expr $a + $b] } namespace import MyMath::* puts [Add 10 30]当执行上面的代码,产生以下结果:
40
可以通过使用forget子删除导入的命名空间。一个简单的例子如下所示。
#!/usr/bin/tclsh namespace eval MyMath { # Create a variable inside the namespace variable myResult namespace export Add } # Create procedures inside the namespace proc MyMath::Add {a b } { return [expr $a + $b] } namespace import MyMath::* puts [Add 10 30] namespace forget MyMath::*
当执行上面的代码,产生以下结果:
40