2017-03-29 9 views
0

パッケージの内容をグローバル名前空間ではなく現在の名前空間にロードするにはどうすればよいですか?パッケージを現在の名前空間にロード

は私がpackage.tcl

package provide pgkTest 1.0 

variable _value "" 
proc get_value {} { 
    variable _value 
    return _value 
} 

次のパッケージがpkgIndex.tclにリストされていると発見された。仮定します今、私がやりたい、別のフォルダ内のメインスクリプトで:

namespace eval myns1 { 
    package require pgkTest 1.0 
    package forget pgkTest 
} 

namespace eval myns2 { 
    package require pgkTest 1.0 
    package forget pgkTest 
} 

しかし、これは、パッケージがグローバル名前空間にロードされるため、::、デフォルトで動作するようには思えません。

答えて

0

あなたがしようとしているのは、各パッケージ(その名前によって決定される)が多くても一度インタプリタにロードされるため動作しません。

package require pgkTest 1.0 

namespace eval myns1 { 
    ::pgkTest::setup 
} 

namespace eval myns2 { 
    ::pgkTest::setup 
} 
:あなたが欲しい 効果を得るためにこれを行うことができます次に

package provide pgkTest 1.0 

namespace eval ::pgkTest {} 
proc ::pgkTest::setup {{targetNamespace ""}} { 
    # If caller doesn't give a namespace, get the caller's namespace 
    if {$targetNamespace eq ""} { 
     set targetNamespace [uplevel 1 {namespace current}] 
    } 
    namespace eval $targetNamespace { 
     variable _value "" 
     proc get_value {} { 
      variable _value 
      return _value 
     } 
    } 
} 

:代わりに、パッケージには、おそらくあなたが後にしている機能を与えられた名前空間を設定し、コマンドを提供するべきです

この種のことを本当にやっているのであれば、は、TclOO、[incr Tcl]、またはXOTclのようなオブジェクトシステムの使用に切り替えることを検討してください。これらは、すべて同じである(またはマイナーなバリエーションを持つ)たくさんのコピーをスタンピングするという問題に取り組むために、はるかに多く設計されています。

関連する問題