2013-08-23 11 views
5

Tworzę dynamiczną zmienną („Zmienna zmienna” w PHP żargonie), o następującym:Ocenianie się „zmienną zmienną”

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

Ale jak mogę uzyskać wartość otrzymanego zmiennej o nazwie „test1_result_data "dynamicznie? Próbowałem następujące:

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

, ale po prostu zwraca "test1_result_data".

Odpowiedz

5

W REBOL-3 wiążący jest inny niż REBOL-2, istnieją różne możliwości:

clumsiest opcji za pomocą load:

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

nie jest funkcja, której obciążenie używa - intern - która może być użyta do powiązania i pobrania słowa do spójnego kontekstu:

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

W przeciwnym razie to word! tworzy niezwiązane słowo, które nie jest łatwe do wykorzystania.

Trzecią opcją jest użycie bind/new powiązać słowo w kontekście

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

W takich okolicznościach często wracam do LOAD, ale czy istnieje sformułowanie używające BIND? Czasami masz coś, co może być SŁOWA! lub SET-WORD! itp., a także szykowanie go i ŁADOWANIE jest bardzo niezręczne. – HostileFork

+0

Zgodnie z rozmową na czacie, jednym ze sposobów unikania ŁADU jest użycie INTERN (którego źródło oferuje jeszcze bardziej elementarną kontrolę kontekstu słowa). 'USTAW INTERN DO SŁOWA! "arbitralne słowo" "Coś" POSTAĆ SIĘ DO SŁOWA! "arbitralne słowo" ' – rgchris

8

jak wasz przykład kod jest REBOL 2, można użyć GET, aby uzyskać wartość słowo:

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

REBOL 3 obsługuje konteksty inaczej niż REBOL 2. Dlatego podczas tworzenia nowego słowa trzeba będzie obsługiwać jego kontekst jawnie, w przeciwnym razie nie będzie miał kontekstu, a podczas próby ustawienia pojawi się błąd. Jest to przeciwieństwo REBOLU 2, które domyślnie ustawia kontekst słowa.

Więc można rozważyć użycie REBOL Kod 3 jak poniżej, aby ustawić/zdobycie zmienne dynamiczne:

; 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 

Bieganie to jako plony Scenariusz:

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 
] 

alternatywa do stosowania podano mogło być używanie BIND:

bound-var: bind :var obj 
+1

Zdecydowanie polecam tę odpowiedź. Oprócz bycia odruchowo przeciwko użyciu "rób takie rzeczy, istnieje dobra równowaga między" ustaw i "(lub" nie ustaw "). – rgchris