Pregunta

Aquí, he intentado establecer el valor de una variable global desde dentro de una función, pero el valor no ha cambiado:

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

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

¿Es posible modificar el valor del parámetro de una función dentro de la función en sí misma, de modo que el valor se modifica dentro del alcance global en lugar del alcance de la función?

¿Fue útil?

Solución

Pasó un valor entero, no una palabra. Dentro de la función, la palabra THEVAR1 se le asigna el valor de ese entero. Reasignarlo no lo cambia, porque los valores como enteros y fechas y números decimales no son "punteros" debajo del capó.

Por lo tanto, la respuesta de @sqlab, donde puede pasar esto por varias formas de obtener la palabra en sí. La diferencia entre function ['x] [code] y function [:x] [code] puede interesarle a un lado ...

¿Por qué no rebol 3 honor ¿Parámetros de la función citada que están paréntesis?

Pero tenga en cuenta que los valores de la serie en Rebol tienen funciones modificadoras que afectan al objetivo, vs. simplemente reasignación de dónde se señala la palabra. Considere:

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

theVar: "Original"

setGlobalScope theVar

print theVar

que imprime Modification.

Si necesita pasar Valores no en serie por referencia, debe colocarlos en una serie y usar las operaciones de modificación de la serie en lugar de la asignación. Porque una tarea simplemente sobrescribiría el "puntero" que tiene hasta el bloqueo o lo que sea. El peor de los casos del escenario puede envolver un solo valor en un bloque, si debe. Pero Rebol tiene un montón de "esperar, míralo de esta manera ..." donde el dialecto llega al rescate al crear una interfaz mejor que esa cosa que intentaba clonar de otro lenguaje menos fresco. - -)

mitigar la complejidad de la aprobación por referencia es la simplicidad de Rebol al manejar los resultados de devolución múltiples:

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

set [a b] foo 03 04

print a
print b

que sale 10 y 20.

Otros consejos

utilizando una combinación de palabra iluminada y palabra, hay más de una forma.

e.g

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

>> 
>> setGlobalScope theVar
== 10

>> 
>> print theVar
10

y

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

>> setGlobalScope 'theVar
== 10

>> print theVar
10

Creo que puede modificar su variable THEVAR directamente en su Funct setglobalscope.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top