位置:首頁 > 腳本語言 > Tcl教學 > TCL命名空間

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