Tcl 命名空间

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
Bash

当上述代码被执行时,会产生以下结果 –

33
Bash

在上面的程序中,你可以看到有一个带有变量 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
Bash

当上述代码被执行时,它产生以下结果−

test1
test2
Bash

导入和导出命名空间

在前面的命名空间示例中,我们使用了很多作用域解析运算符,使用起来更复杂。我们可以通过导入和导出命名空间来避免这个问题。下面是一个示例:

#!/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]
Bash

当执行上述代码时,将产生如下结果 −

40
Bash

忘记命名空间

你可以通过使用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::*
Bash

当执行以上代码时,它生成以下结果−

40
Bash

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册