2013-08-23 28 views
5

tôi là tạo ra một biến động ("biến Variable" trong PHP cách nói) như sau:Đánh giá một "biến biến"

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

Nhưng làm thế nào để tôi nhận được giá trị của biến kết quả có tên là "test1_result_data "động? Tôi đã thử các cách sau:

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

nhưng nó chỉ trả về "test1_result_data".

Trả lời

5

Trong Rebol 3 ràng buộc khác với Rebol 2 và có một số tùy chọn khác nhau:

Tùy chọn clumsiest đang sử dụng load:

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

Có một chức năng tải sử dụng-- intern - có thể được sử dụng để liên kết và truy lục từ đến và từ ngữ cảnh nhất quán:

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

Nếu không, to word! sẽ tạo một từ không liên kết không dễ sử dụng.

Lựa chọn thứ ba là sử dụng bind/new để ràng buộc từ một bối cảnh

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

Tôi thấy mình quay trở lại LOAD rất nhiều trong những trường hợp này, nhưng có một công thức sử dụng BIND? Đôi khi bạn có cái gì đó có thể là WORD! hoặc SET-WORD! vv, và xâu chuỗi nó và LOADing nó là rất khó xử. – HostileFork

+0

Theo một cuộc thảo luận trò chuyện, một cách để tránh LOAD là sử dụng INTERN (nguồn cung cấp khả năng kiểm soát nguyên tố nhiều hơn về ngữ cảnh của một từ). 'THIẾT LẬP INTERN TO WORD! "tùy ý-từ" "Một cái gì đó" GET INTERN TO WORD! "arbitrary-word" ' – rgchris

8

Như mã ví dụ của bạn là REBOL 2, bạn có thể sử dụng GET để có được giá trị của từ:

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

REBOL 3 xử lý các bối cảnh khác với REBOL 2. Vì vậy, khi tạo một từ mới, bạn sẽ cần xử lý ngữ cảnh của nó một cách rõ ràng nếu không nó sẽ không có ngữ cảnh và bạn sẽ gặp lỗi khi bạn cố gắng đặt nó. Điều này trái ngược với REBOL 2, đặt ngữ cảnh của từ theo mặc định.

Vì vậy, bạn có thể xem xét sử dụng REBOL 3 mã như sau để SET/GET biến động của bạn:

; 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 

Chạy này như một sản lượng kịch bản:

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 
] 

Một thay thế cho việc sử dụng TRÊN trên có thể đã sử dụng BIND:

bound-var: bind :var obj 
+1

Tôi rất muốn giới thiệu câu trả lời này. Ngoài phản xạ chống lại việc sử dụng 'làm cho những thứ như vậy, có sự cân bằng tốt giữa' set 'và' get 'hoặc' unset '. – rgchris

Các vấn đề liên quan