variable — 네임스페이스 변수 만들고 초기화하기
variable — 네임스페이스 변수 만들고 초기화하기
네임스페이스 안에서 변수를 관리해야 할 때 variable 명령어가 정리돼요. 주로 namespace eval 안에서 변수를 만들고 초기화하는 데 쓰이고, 프로시저 안에서 네임스페이스 변수에 연결된 지역 변수를 만드는 데도 쓰여요. global이 전역 네임스페이스 기준이라면, variable은 현재 네임스페이스 기준이라는 차이가 있어요.
출처: 문서
본문
문법
variable name
variable ?name value...?
이 명령어는 보통 namespace eval 명령어 안에서 사용되어, 네임스페이스 안에 하나 이상의 변수를 만들어요. 각 변수 name은 value로 초기화돼요. 마지막 변수의 값은 선택사항이에요.
변수 name이 존재하지 않으면 만들어져요. 이 경우 value가 지정되면 새로 만든 변수에 할당되고, value가 지정되지 않으면 새 변수는 정의되지 않은 채로 남아요. 변수가 이미 존재하면 value가 지정되면 그 값으로 설정되고, 값이 주어지지 않으면 그대로 둬요.
보통 name은 비한정(unqualified, 어떤 포함 네임스페이스의 이름도 포함하지 않음)이고, 변수는 현재 네임스페이스에 만들어져요. name이 네임스페이스 한정자들을 포함하면, 변수는 지정된 네임스페이스에 만들어져요. 변수가 정의되지 않았다면 namespace which 명령어에는 보이지만 info exists 명령어에는 보이지 않아요.
variable 명령어가 Tcl 프로시저 안에서 실행되면, 해당 네임스페이스 변수에 연결된 지역 변수들을 만들어요(그래서 그 변수들은 info vars에 나열돼요). 이런 점에서 variable 명령어는 global 명령어와 비슷해요. 다만 global 명령어는 변수 이름을 프로시저의 현재 네임스페이스가 아니라 전역 네임스페이스 기준으로 해석한다는 차이가 있어요. 값이 주어지면 그 값으로 연결된 네임스페이스 변수들의 값을 수정해요. 네임스페이스 변수가 존재하지 않으면 만들어지고 선택적으로 초기화돼요.
name 인자는 배열 안의 한 원소를 가리킬 수 없어요. 대신 name은 배열 전체를 가리켜야 하고, 초기화 값은 빼야 해요. 변수를 선언한 뒤에는 보통 set이나 array 명령어로 배열 안의 원소들을 설정할 수 있어요.
예제
네임스페이스에 변수 만들기:
namespace eval foo {
variable bar 12345
}
네임스페이스에 배열 만들기:
namespace eval someNS {
variable someAry
array set someAry {
someName someValue
otherName otherValue
}
}
프로시저에서 네임스페이스 변수들에 접근하기:
namespace eval foo {
proc spong {} {
# Variable in this namespace
variable bar
puts "bar is $bar"
# Variable in another namespace
variable ::someNS::someAry
parray someAry
}
}
더 알아보기
global,namespace,upvar— 변수·네임스페이스 관련 명령어- 관련 키워드:
global,namespace,procedure,variable