Tcl - 名稱空間



名稱空間是用於分組變數和過程的一組識別符號的容器。名稱空間從 Tcl 8.0 版本開始可用。在引入名稱空間之前,只有一個全域性作用域。現在有了名稱空間,我們有了全域性作用域的額外分割槽。

建立名稱空間

使用namespace命令建立名稱空間。下面顯示了一個建立名稱空間的簡單示例:

#!/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
廣告