2009-10-13 98 views
1
proc foo {param} { 
    namespace eval foo_ns { 
    uplevel {set foo_ns::x $param } 
    } 
} 

這看起來很醜。導入proc變量到命名空間

[upvar]將不起作用,因爲它無法鏈接到'參數'。

謝謝。從答案

代碼不起作用(tclsh8.4)

------------------------------- ------------

% proc bar {param} { 
    namespace eval foo_ns { 
     uplevel [list set foo_ns::x $param] 
    } 
    } 
% bar 123 
can't read "param": no such variable 

------------------------------- ------------

% proc foo {param} { 
    set ::foo_ns::x $param 
} 
% foo 123 
can't set "::foo_ns::x": parent namespace doesn't exist 
+0

你能描述一下它是什麼,你要完成,而不是隻顯示代碼,不是嗎? – RHSeeger 2009-10-13 17:59:27

+0

'uplevel [list set foo_ns :: x $ param]' – 2009-10-13 17:59:42

+0

它對我不起作用(tclsh8.4)。 %觸發杆{PARAM} { 命名空間的eval foo_ns { uplevel [列表集合foo_ns :: X $ PARAM] } } %條123 不能讀取 「參數」:沒有這樣的可變 – name 2009-10-14 11:16:35

回答

2

命名空間和級別是兩個不同的東西。這個問題你不需要高級的。

下面是一個創建命名空間並設置變量,某行的簡單的解決方案:

proc foo {param} { 
    namespace eval ::foo_ns [list set x $param] 
} 
4

什麼是錯的:

proc foo {param} { 
    set ::foo_ns::x $param 
} 

在我的測試中,它似乎完成了同樣的目標。

更新:感謝K0re指出這一點。在致電foo之前,您需要定義名稱空間:

namespace eval ::foo_ns {} 
+0

#tclsh8。4 %觸發FOO {PARAM} { 集:: foo_ns :: X $ PARAM } %FOO 123 不能設置 「:: foo_ns :: X」:父命名空間不存在 – name 2009-10-14 11:13:42

+0

格式看起來很醜陋,然而,它結束於: 無法設置「:: foo_ns :: x」:父命名空間不存在 – name 2009-10-14 11:14:23

+0

@ K0re:在調用foo之前,您必須定義命名空間: namespace eval :: foo_ns {} – 2009-10-14 15:31:44

1

好的,您有兩個不同的問題。首先是命名空間不存在;第二個是你需要編寫代碼,以便在該命名空間中創建/寫入變量。總體而言,這一要求只有海的代碼細小的改動:

proc foo {param} { 
    # Create the namespace if it doesn't already exist 
    namespace eval ::foo_ns {} 
    # Set the variable in the namespace 
    set ::foo_ns::x $param 
} 

由於對一些您遇到的問題解說:

proc foo {param} { 
    namespace eval foo_ns { 
    uplevel {set foo_ns::x $param } 
    } 
} 

這不工作,因爲你是,有效,在命名空間「foo_ns」中輸入以下內容: ,在堆棧頂層運行以下代碼: ,並輸入以下代碼: 「set foo :: x $ param」

但是,在堆棧頂層,變量「param」沒有值(它只在過程中定義)。您需要確保它事先取得。我會包含可行的代碼,但老實說,我擔心這會導致與問題的實際答案混淆......所以我會放棄它。

+0

第二個代碼(我之前寫的代碼)工作良好。 我只是不喜歡語法 - 它很醜。 第一個代碼看起來更好。 謝謝。 – name 2009-10-14 16:34:33

+0

我不能跟隨哪些代碼是你不喜歡的......但只要你能得到它的工作和理解爲什麼,那麼這是一切都好:) – RHSeeger 2009-10-14 16:40:04