Tcl - 命名空间
命名空间是一组标识符的容器,用于对变量和过程进行分组。 从 Tcl 版本 8.0 开始可以使用命名空间。 在引入命名空间之前,存在单一的全局作用域。 现在有了命名空间,我们就有了额外的全局范围分区。
创建命名空间
命名空间是使用namespace命令创建的。 创建命名空间的简单示例如下所示 −
#!/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命名空间
您可以使用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