是否可以在Rebol中通过引用传递参数?

时间:2014-06-04 18:46:05

标签: rebol3

在这里,我试图从函数内部设置全局变量的值,但值没有改变:

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

print theVar
"This prints 1 instead of 10. The value of theVar has not changed."

是否可以从函数本身内部修改函数参数的值,以便在全局范围内修改该值而不是函数的范围?

3 个答案:

答案 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

输出1020

答案 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。