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