2016-05-03 3 views
0

пространство имен должно быть простым текстом, оно не может быть мета-элементами, такими как скрипт переменной или вложенности. Например. вы не можете сделать следующее:Может ли пространство имен быть переменным

set ns ::my_ns 
set ::my_ns::var1 100 
puts ${$ns}var1  <== wrong 
puts $$nsvar1  <== wrong 

Не могли бы вы подтвердить?

+0

'$ {$ ns}' и '$$ ns' не делают то, что вы пытаетесь сделать. Используйте '[set $ ns]' как в ответе Колина. –

ответ

2

Это работает:

% namespace eval my_ns { set var1 100 } 
100 
% incr ::my_ns::var1 
101 
% set ns ::my_ns 
::my_ns 
% puts [set ${ns}::var1] 
101 
1

Вы не можете использовать синтаксис $ сделать это; это синтаксическое ограничение. Вы должны использовать что-то вроде одного аргумента формы set:

puts [set ${ns}::var1] 

НО у вас есть гораздо лучший вариант, доступный для вас, если вы находитесь внутри процедуры. В namespace upvar команда ручки такого рода вещи красиво:

proc printVariable {ns} { 
    namespace upvar $ns var1 v 
    puts $v 
} 

Кроме того, если вы делаете это, чтобы моделировать систему объекта, пожалуйста, прекратите. Вместо этого используйте реальную систему объектов (например, TclOO, которая поставляется как встроенная часть Tcl 8.6).

Смежные вопросы