Domanda

Qui, ho tentato di impostare il valore di una variabile globale da una funzione, ma il valore non è cambiato:

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

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

È possibile modificare il valore del parametro di una funzione dall'interno della funzione stessa, in modo che il valore sia modificato all'interno della portata globale anziché nell'ambito della funzione?

È stato utile?

Soluzione

Hai passato un valore intero, non una parola. All'interno della funzione, la parola thevar1 è assegnata il valore di quel numero intero. Riassegnazione non cambia, perché i valori come interi e date e numeri decimali non sono "puntatori" sotto il cofano.

Quindi, la risposta da @sqlab dove puoi aggirarti con vari modi per ottenere la parola stessa. La differenza tra function ['x] [code] e function [:x] [code] potrebbe interessarti come da parte ...

Perché non rebolisce 3 onore Parametri della funzione quotati parentatrici?

Ma nota che i valori della serie in Rebol hanno la modifica delle funzioni che influenzano il bersaglio, vs. solo riassegnazione di dove i punti di parola. Considera:

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

theVar: "Original"

setGlobalScope theVar

print theVar
.

che stampa Modification.

Se è necessario passare valori non serie per riferimento, è necessario inserirli in una serie e utilizzare le operazioni di modifica della serie anziché l'assegnazione. Perché un incarico sovrascriverebbe solo il "puntatore" che devi al blocco o altro. Scenario peggiore del caso È possibile avvolgere un singolo valore in un blocco - se è necessario. Ma Rebol ha un sacco di "Aspetta, guardalo in questo modo ..." Dove la dialettatura viene in soccorso nella creazione di un'interfaccia migliore di quella cosa che stavi cercando di clonare da un altro linguaggio meno fresco. : -)

Mitigare La complessità del passaggio per riferimento è la semplicità di Rebol nella gestione dei risultati di ritorno multipli:

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

set [a b] foo 03 04

print a
print b
.

che uscite 10 e 20.

Altri suggerimenti

Utilizzando una combinazione di word-word e get-word c'è più di un modo.

E.G

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

>> 
>> setGlobalScope theVar
== 10

>> 
>> print theVar
10
.

e

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

>> setGlobalScope 'theVar
== 10

>> print theVar
10
.

Penso che tu possa semplicemente modificare la tua variabile direttamente nel tuo Funct SetGlobalsCope.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top