2013-03-29 7 views
0

Я довольно много newb, и я пытаюсь установить некоторые переменные в пространстве имен, которые используют argv, а затем вызывать их из proc за пределами пространства имен , но мне трудно понять, как это сделать. Я пытаюсь использовать код вроде этого (но очевидно, что это неправильный способ сделать это):TCL, вызывающий переменную пространства имен из proc вне пространства имен

namespace eval Ns { 
    variable spec [lindex $argv 1] 
} 

proc p {} { 
    set spec "::Ns::spec" 

} 

ответ

1

Правильный путь заключается в использовании variable:

proc p {} { 
    variable ::Ns::spec 
    # ... 
} 

Также возможна upvar:

proc p {} { 
    upvar #0 ::Ns::spec spec 
    # ... 
} 

или (почти), как вы делали это:

proc p {} { 
    set spec $::Ns::spec 
    # ... 
} 

Эта последняя возможность не изменит переменную, если она изменена в proc.

+0

Спасибо за ответ! Я понимаю ошибку, которую я совершил в proc сейчас ... но можете ли вы объяснить немного о том, что на самом деле делает 'variable'? Я думал, что он использовался, чтобы установить переменную только в пространстве имен, но ясно, что я ошибался ... – KaleidoEscape

+0

Он может это сделать, но также может использоваться для импорта переменной в proc. См. Третий абзац [manual] (http://www.tcl.tk/man/tcl8.6/TclCmd/variable.htm) –

+0

@KaleidoEscape Команда 'variable' создает переменную (если необходимо) в названии namespace - по умолчанию для пространства имен _current_, если не указано ни одно другое, - и задает значение этой переменной, если указан второй аргумент. Наконец, если он находится в контексте, который имеет локальные переменные (например, процедуру), он делает локальную переменную с тем же именем, что и _last part_ в имени переменной, как связанный псевдоним с указанной переменной пространства имен. Многое использование 'переменной' на самом деле является вырожденным случаем, когда части выполняются с использованием значений по умолчанию. –

0

... Или сделать вызов возвращает значение:

proc Ns::getspec { } { 
    variable spec 

    return spec; 
} 
Смежные вопросы