Est-il possible de passer des paramètres par référence dans Rebol ?

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

  •  21-12-2019
  •  | 
  •  

Question

Ici, j'ai tenté de définir la valeur d'une variable globale depuis l'intérieur d'une fonction, mais la valeur n'a pas changé :

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

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

Est-il possible de modifier la valeur du paramètre d'une fonction depuis l'intérieur de la fonction elle-même, de sorte que la valeur soit modifiée dans la portée globale au lieu de la portée de la fonction ?

Était-ce utile?

La solution

Vous avez transmis une valeur entière, pas un mot.Dans la fonction, le mot theVar1 se voit attribuer la valeur de cet entier.Le réaffecter ne le change pas, car les valeurs telles que les entiers, les dates et les nombres décimaux ne sont pas des « pointeurs » sous le capot.

D'où la réponse de @sqlab où vous pouvez contourner ce problème de différentes manières pour obtenir le mot lui-même.La différence entre function ['x] [code] et function [:x] [code] peut vous intéresser en aparté...

Pourquoi Rebol 3 ne respecte-t-il pas les paramètres de fonction cités entre parenthèses ?

Mais notez que les valeurs des séries dans Rebol ont des fonctions de modification qui affectent la cible, par rapport à la cible.juste une réaffectation de l'endroit où le mot pointe.Considérer:

setGlobalScope: func [theVar1 [string!]] [
    clear theVar1
    insert theVar1 "Modification"
]

theVar: "Original"

setGlobalScope theVar

print theVar

Cela imprime Modification.

Si tu dois réussir valeurs hors série par référence, vous devez les mettre dans une série et utiliser des opérations de modification de série au lieu d'affectation.Parce qu'une affectation écraserait simplement le "pointeur" dont vous disposez vers le bloc ou autre.Dans le pire des cas, vous pouvez envelopper une seule valeur dans un bloc, si vous le devez.Mais Rebol a beaucoup de "attendez, regardez les choses autrement..." où la dialectisation vient à la rescousse en créant une meilleure interface que ce que vous essayiez de cloner à partir d'un autre langage moins cool.:-)

La simplicité de Rebol dans la gestion de plusieurs résultats de retour atténue la complexité du passage par référence :

foo: function [value1 value2] [
    return reduce [
        value1 + 7
        value2 + 16
    ]
]

set [a b] foo 03 04

print a
print b

Cela produit 10 et 20.

Autres conseils

En utilisant une combinaison de mot allumé et que vous obtenez un mot, il y a plus d'une manière.

E.g

>> setGlobalScope: func ['theVar1] [set :theVar1 10]
>> theVar: 1
== 1

>> 
>> setGlobalScope theVar
== 10

>> 
>> print theVar
10

et

>> setGlobalScope: func [theVar1] [set :theVar1 10]
>> theVar: 1
== 1

>> setGlobalScope 'theVar
== 10

>> print theVar
10

Je pense que vous pouvez simplement modifier votre variable TheVar directement dans votre groupe de travail SETGLOBALSCOPE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top