我正在使用以下内容创建一个动态变量(PHP 用语中的“变量变量”):
foo: "test1"
set to-word (rejoin [foo "_result_data"]) array 5
但是如何动态获取名为“test1_result_data”的结果变量的值?我尝试了以下方法:
probe to-word (rejoin [foo "_result_data"])
但它只是返回“test1_result_data”。
我正在使用以下内容创建一个动态变量(PHP 用语中的“变量变量”):
foo: "test1"
set to-word (rejoin [foo "_result_data"]) array 5
但是如何动态获取名为“test1_result_data”的结果变量的值?我尝试了以下方法:
probe to-word (rejoin [foo "_result_data"])
但它只是返回“test1_result_data”。
由于您的示例代码是 REBOL 2,您可以使用 GET 来获取单词的值:
>> get to-word (rejoin [foo "_result_data"])
== [none none none none none]
REBOL 3 处理上下文与 REBOL 2 不同。因此,当创建一个新单词时,您需要明确处理它的上下文,否则它将没有上下文,并且当您尝试设置它时会出现错误。这与默认设置单词上下文的 REBOL 2 形成对比。
因此,您可以考虑使用如下 REBOL 3 代码来设置/获取您的动态变量:
; 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
将其作为脚本运行会产生:
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
]
上面使用 IN 的替代方法可能是使用 BIND:
bound-var: bind :var obj
在 Rebol 3 中,绑定不同于 Rebol 2,并且有一些不同的选项:
最笨拙的选择是使用load
:
foo: "test1"
set load (rejoin [foo "_result_data"]) array 5
do (rejoin [foo "_result_data"])
有一个 load 使用的函数——intern
可用于将单词绑定到一致的上下文和从一致的上下文中检索单词:
foo: "test1"
set intern to word! (rejoin [foo "_result_data"]) array 5
get intern to word! (rejoin [foo "_result_data"])
否则to word!
会创建一个不易使用的未绑定词。
第三个选项是用于bind/new
将单词绑定到上下文
foo: "test1"
m: bind/new to word! (rejoin [foo "_result_data"]) system/contexts/user
set m array 5
get m
probe do (rejoin [foo "_result_data"])
来自http://www.rebol.com/docs/core23/rebolcore-4.html#section-4.6