Можно ли передавать параметры по ссылке в Rebol?

StackOverflow https://stackoverflow.com//questions/24045229

  •  21-12-2019
  •  | 
  •  

Вопрос

Здесь я попытался установить значение глобальной переменной изнутри функции, но значение не изменилось:

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

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

Можно ли изменить значение параметра функции изнутри самой функции, чтобы значение изменялось в глобальной области, а не в области действия функции?

Это было полезно?

Решение

Вы передали целое значение, а не слово.Внутри функции слову theVar1 присваивается значение этого целого числа.Переназначение его не меняет, потому что такие значения, как целые числа, даты и десятичные числа, не являются «указателями» под капотом.

Отсюда и ответ от @sqlab, где это можно обойти различными способами получения самого слова.Разница между function ['x] [code] и function [:x] [code] может вас заинтересовать в качестве отступления...

Почему Rebol 3 не учитывает параметры функции в кавычках, заключенные в круглые скобки?

Но обратите внимание, что значения серий в 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.

Другие советы

Используя комбинацию освещенного слова и полученного слова. Существует более одного способа.

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
.

Я думаю, что вы можете просто изменять вашу переменную TheVar прямо в вашем SetGlobalscope Funct.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top