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