2016-05-03 4 views
0

名前空間はプレーンテキストでなければなりません。変数やネストスクリプトなどのメタ要素にすることはできません。例えば。次のような方法はありません。名前空間を可変にすることができます

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

ご確認いただけますか?

+0

'$ {$ ns}'と '$$ ns'はあなたがしようとしていることをしません。 Colinの答えのように '[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 
} 

あなたがオブジェクトシステムをシミュレートするためにこれをやっている場合は、おやめください。代わりに実際のオブジェクトシステムを使用します(Tcl 8.6の組み込み部分として出荷されるTclOOなど)。

関連する問題