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