名稱空間是一個(gè)容器組標(biāo)識(shí)符,用于組變量和程序。命名空間可從Tcl 8.0版開始使用。引入命名空間之前,有一個(gè)全局范圍?,F(xiàn)在有了命名空間,我們可以分區(qū)全局范圍。
使用命名空間命令創(chuàng)建命名空間。一個(gè)簡(jiǎn)單的例子,創(chuàng)建命名空間如下圖所示
#!/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
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
33
在上面的程序,可以看到有一個(gè)變量myResult和程序Add的一個(gè)命名空間。這使得創(chuàng)建變量和程序可根據(jù)相同的名稱在不同的命名空間。
TCL允許命名空間的嵌套。一個(gè)簡(jiǎn)單的例子,嵌套的命名空間如下。
#!/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
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
test1 test2
可以在前面的例子命名空間看到,我們使用了大量的作用范圍解決運(yùn)算符,它們的使用變得更復(fù)雜。我們可以通過導(dǎo)入和導(dǎo)出命名空間避免這種情況。下面給出一個(gè)例子。
#!/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]
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
40
可以通過使用forget子刪除導(dǎo)入的命名空間。一個(gè)簡(jiǎn)單的例子如下所示。
#!/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::*
當(dāng)執(zhí)行上面的代碼,產(chǎn)生以下結(jié)果:
40