Пространство имен — это контейнер для набора идентификаторов, который используется для группировки переменных и процедур. Пространства имен доступны из 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
Забыть пространство имен
Вы можете удалить импортированное пространство имен, используя подкоманду Forgot. Простой пример показан ниже —
#!/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::*
Когда приведенный выше код выполняется, он дает следующий результат —