Учебники

Tcl — Пространства имен

Пространство имен — это контейнер для набора идентификаторов, который используется для группировки переменных и процедур. Пространства имен доступны из Tcl версии 8.0. До введения пространств имен существовала единая глобальная область. Теперь с пространствами имен у нас есть дополнительные разделы глобальной области видимости.

Создание пространства имен

Пространства имен создаются с помощью команды namespace . Простой пример создания пространства имен показан ниже —

Live Demo

#!/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 позволяет вложить пространства имен. Простой пример для вложения пространств имен приведен ниже —

Live Demo

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

Импорт и экспорт пространства имен

Вы можете видеть в предыдущих примерах пространства имен, мы используем много операторов разрешения области видимости, и это более сложный в использовании. Мы можем избежать этого, импортируя и экспортируя пространства имен. Пример приведен ниже —

Live Demo

#!/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. Простой пример показан ниже —

Live Demo

#!/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::*

Когда приведенный выше код выполняется, он дает следующий результат —