在这里,我试图从函数内部设置全局变量的值,但值没有改变:
setGlobalScope: func [theVar1] [
theVar1: 10
]
theVar: 1
setGlobalScope theVar
print theVar
"This prints 1 instead of 10. The value of theVar has not changed."
是否可以从函数本身内部修改函数参数的值,以便在全局范围内修改该值而不是函数的范围?
答案 0 :(得分:4)
您传递的是整数值,而不是单词。在函数中,单词theVar1被赋予该整数的值。重新分配它并不会改变它,因为整数,日期和十进制数等值不是指针"指针"引擎盖下。
因此,来自@sqlab的答案,你可以通过各种方式获得这个词本身来解决这个问题。 function ['x] [code]
和function [:x] [code]
之间的差异可能会让您感到骄傲......
Why doesn't Rebol 3 honor quoted function parameters that are parenthesized?
但请注意,Rebol中的系列值确实具有影响目标的修改函数,而不仅仅是重新指定单词指向的位置。考虑:
setGlobalScope: func [theVar1 [string!]] [
clear theVar1
insert theVar1 "Modification"
]
theVar: "Original"
setGlobalScope theVar
print theVar
打印Modification
。
如果您需要通过引用传递非系列值,则需要将它们放在一个系列中并使用系列修改操作而不是赋值。因为赋值只会覆盖"指针"你必须要阻止或其他什么。最糟糕的情况是,您可以在块中包含单个值 - 如果必须的话。但Rebol有很多"等等,从另一个角度看待它......"在那里进行辩证,创造一个比你试图从另一种不那么酷的语言克隆的东西更好的界面。 : - )
通过引用减少传递的复杂性是Rebol在处理多个返回结果时的简单性:
foo: function [value1 value2] [
return reduce [
value1 + 7
value2 + 16
]
]
set [a b] foo 03 04
print a
print b
输出10
和20
。
答案 1 :(得分:3)
通过使用lit-word和get-word的组合,有多种方法。
e.g
>> setGlobalScope: func ['theVar1] [set :theVar1 10]
>> theVar: 1
== 1
>>
>> setGlobalScope theVar
== 10
>>
>> print theVar
10
和
>> setGlobalScope: func [theVar1] [set :theVar1 10]
>> theVar: 1
== 1
>> setGlobalScope 'theVar
== 10
>> print theVar
10
答案 2 :(得分:0)
我认为您可以直接在setGlobalScope功能中修改变量theVar。