2017-03-29 5 views
0

Wie kann ich den Inhalt eines Pakets anstelle des globalen Namespace in den aktuellen Namespace laden?Paket in aktuellen Namespace laden

Angenommen, ich habe folgendes package.tcl

package provide pgkTest 1.0 

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

Das Paket in pkgIndex.tcl aufgeführt wird und gefunden wird. Jetzt im Haupt Skript in einem anderen Ordner würde ich tun:

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

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

Dies ist jedoch nicht zu funktionieren scheint, da das Paket in den globalen Namensraum geladen wird :: standardmäßig.

Antwort

0

Was Sie versuchen zu tun, wird nicht funktionieren, weil jedes Paket (wie durch seinen Namen bestimmt) höchstens einmal in einen Interpreter geladen wird. Stattdessen sollte das Paket wahrscheinlich einen Befehl zur Verfügung zu stellen, die einen bestimmten Namespace mit den Merkmalen richtet Sie nach:

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 
     } 
    } 
} 

Dann können Sie dies tun, um die Effekt zu erhalten Sie wollen:

package require pgkTest 1.0 

namespace eval myns1 { 
    ::pgkTest::setup 
} 

namespace eval myns2 { 
    ::pgkTest::setup 
} 

Wenn Sie wirklich so etwas tun, in Erwägung ziehen, auf ein Objektsystem wie TclOO, [incr Tcl] oder XOTcl zu wechseln. Sie sind viel mehr für das Problem der Ausrottung vieler Kopien von Dingen, die alle gleich sind (oder kleinere Abweichungen haben) entwickelt.

Verwandte Themen