位置:首页 > > TCL命名空间

TCL命名空间

名称空间是一个容器组标识符,用于组变量和程序。命名空间可从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