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子命令删除导入的命名空间。下面显示了一个简单的示例:

#!/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
广告