名稱空間是一個容器組識別符號,用於組變數和程式。名稱空間可從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