Tcl - przestrzenie nazw
Przestrzeń nazw to kontener na zestaw identyfikatorów używany do grupowania zmiennych i procedur. Przestrzenie nazw są dostępne od wersji Tcl 8.0. Przed wprowadzeniem przestrzeni nazw istniał jeden zakres globalny. Teraz z przestrzeniami nazw mamy dodatkowe partycje o zasięgu globalnym.
Tworzenie przestrzeni nazw
Przestrzenie nazw są tworzone przy użyciu namespaceKomenda. Poniżej przedstawiono prosty przykład tworzenia przestrzeni nazw -
#!/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 
    Wykonanie powyższego kodu daje następujący wynik -
33 
    W powyższym programie widać przestrzeń nazw ze zmienną myResult i procedurę Add. Umożliwia to tworzenie zmiennych i procedur o takich samych nazwach w różnych przestrzeniach nazw.
Zagnieżdżone przestrzenie nazw
Tcl umożliwia zagnieżdżanie przestrzeni nazw. Prosty przykład zagnieżdżania przestrzeni nazw podano poniżej -
#!/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 
    Wykonanie powyższego kodu daje następujący wynik -
test1
test2 
    Importowanie i eksportowanie przestrzeni nazw
Jak widać w poprzednich przykładach przestrzeni nazw, używamy wielu operatorów rozpoznawania zakresów i jest to bardziej złożone w użyciu. Możemy tego uniknąć, importując i eksportując przestrzenie nazw. Przykład podano poniżej -
#!/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] 
    Wykonanie powyższego kodu daje następujący wynik -
40 
    Zapomnij o przestrzeni nazw
Zaimportowaną przestrzeń nazw można usunąć za pomocą forgetpodkomenda. Prosty przykład pokazano poniżej -
#!/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::* 
    Wykonanie powyższego kodu daje następujący wynik -
40