📅  最后修改于: 2020-10-16 06:29:49             🧑  作者: Mango
命名空间是一组标识符的容器,用于对变量和过程进行分组。 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
您可以使用忘记子命令删除导入的名称空间。一个简单的例子如下所示-
#!/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