2013-08-23 14 views
5

Ich erstelle eine dynamische Variable ("Variable Variable" in PHP parlance) Auswertung mit dem folgenden:einen "variable Variable"

foo: "test1" 
set to-word (rejoin [foo "_result_data"]) array 5 

Aber wie bekomme ich den Wert des resultierenden Variable mit dem Namen „test1_result_data "dynamisch? Ich habe versucht, die folgenden:

probe to-word (rejoin [foo "_result_data"]) 

aber es gibt einfach "test1_result_data".

Antwort

5

In Rebol 3-Bindung ist anders als Rebol 2 und es gibt einige verschiedene Möglichkeiten:

Die clumsiest Option load verwendet:

foo: "test1" 
set load (rejoin [foo "_result_data"]) array 5 
do (rejoin [foo "_result_data"]) 

Es gibt eine Funktion, die load uses verwendet - intern - die verwendet werden kann, um das Wort an und aus einem konsistenten Kontext zu binden und abzurufen:

foo: "test1" 
set intern to word! (rejoin [foo "_result_data"]) array 5 
get intern to word! (rejoin [foo "_result_data"]) 

Ansonsten to word! schafft ein ungebundenes Wort, das nicht leicht zu verwenden ist.

Die dritte Option ist bind/new zu verwenden, um das Wort zu einem Kontext

foo: "test1" 
m: bind/new to word! (rejoin [foo "_result_data"]) system/contexts/user 
set m array 5 
get m 
+0

Ich finde mich unter diesen Umständen oft auf LOAD, aber gibt es eine Formulierung mit BIND? Manchmal hast du etwas, das WORT sein könnte! oder SET-WORT! usw., und es zu stringifizieren und zu laden ist sehr umständlich. – HostileFork

+0

Laut Chat-Diskussion ist eine Möglichkeit, LOAD zu vermeiden, die Verwendung von INTERN (dessen Quelle noch mehr elementare Kontrolle über den Kontext eines Wortes bietet). 'Setze INTERN zum Wort! "arbitrary-word" "Etwas" GET INTERN TO WORD! "arbitrary-word" ' – rgchris

8

Als Ihr Beispielcode zu binden, ist REBOL 2 können Sie GET verwenden Sie den Wert des Wortes zu erhalten:

>> get to-word (rejoin [foo "_result_data"]) 
== [none none none none none] 

REBOL 3 behandelt Kontexte anders als REBOL 2. Wenn Sie also ein neues Wort erstellen, müssen Sie dessen Kontext explizit behandeln, andernfalls hat es keinen Kontext und Sie erhalten einen Fehler, wenn Sie versuchen, es zu setzen. Dies steht im Gegensatz zu REBOL 2, bei dem standardmäßig der Kontext des Worts festgelegt wird.

So könnte man REBOL 3-Code wie den folgenden verwenden betrachten SET/GET Ihre dynamische Variablen:

; An object, providing the context for the new variables. 
obj: object [] 

; Name the new variable. 
foo: "test1" 
var: to-word (rejoin [foo "_result_data"]) 

; Add a new word to the object, with the same name as the variable. 
append obj :var 

; Get the word from the object (it is bound to it's context) 
bound-var: in obj :var 

; You can now set it 
set :bound-var now 

; And get it. 
print ["Value of " :var " is " mold get :bound-var] 

; And get a list of your dynamic variables. 
print ["My variables:" mold words-of obj] 

; Show the object. 
?? obj 

das Lauf als Skript liefert:

Value of test1_result_data is 23-Aug-2013/16:34:43+10:00 
My variables: [test1_result_data] 
obj: make object! [ 
    test1_result_data: 23-Aug-2013/16:34:43+10:00 
] 

Eine Alternative IN oben mit bereiter sein können BIND verwenden:

bound-var: bind :var obj 
+1

Ich würde diese Antwort dringend empfehlen. Abgesehen davon, dass man reflexiv dagegen ist, für solche Dinge zu tun, gibt es ein gutes Gleichgewicht zwischen "setzen" und "erhalten" (oder "unscharf"). – rgchris