Tengo dificultades para comprender cuándo y por qué el valor que tiene un Scalar
contenedor enviado se ve afectado después del envío. Trataré de ilustrar el problema que encontré en un contexto más complicado en dos ejemplos estilizados.
* Ejemplo 1 * En el primer ejemplo, un escalar $i
se inserta en una matriz @b
como parte de a List
. Después de la inserción, el valor mantenido por el escalar se actualiza explícitamente en iteraciones posteriores del bucle for utilizando la $i++
instrucción. Estas actualizaciones tienen un efecto en el valor de la matriz @b
: al final del ciclo for, @b[0;0]
es igual a 3
, y ya no lo es 2
.
my @b;
my $i=0;
for 1..3 -> $x {
$i++;
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $x == 2 {
@b.push(($i,1));
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @b;
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
Ejemplo de salida 1:
Loose var $i: Scalar|94884317665520 139900170768608
Loose var $i: Scalar|94884317665520 139900170768648
Pushed $i : Scalar|94884317665520 139900170768648
Loose var $i: Scalar|94884317665520 139900170768688
Post for-loop
Array : [(3 1)]
Pushed $i : Scalar|94884317665520 139900170768688
* Ejemplo 2 * En el segundo ejemplo, el escalar $i
es la variable de bucle. A pesar de que $i
se actualiza después de que ha sido empujado (ahora implícita más que explícitamente), el valor de $i
en la matriz @c
no no
cambia después de pulsar; es decir, después del ciclo for, todavía está 2
, no 3
.
my @c;
for 1..3 -> $i {
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $i == 2 {
@c.push(($i,1));
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @c;
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;;
Ejemplo de salida 2:
Loose var $i: Scalar|94289037186864 139683885277408
Loose var $i: Scalar|94289037186864 139683885277448
Pushed $i : Scalar|94289037186864 139683885277448
Loose var $i: Scalar|94289037186864 139683885277488
Post for-loop
Array : [(2 1)]
Pushed $i : Scalar|94289037186864 139683885277448
Pregunta: ¿Por qué es $i
en @b
en el ejemplo 1 actualizado después de que el empuje, mientras que $i
en @c
en el ejemplo 2 no es?
editar : Siguiendo el comentario de @ timotimo, incluí la salida de .WHERE
en los ejemplos. Esto muestra la identidad escalar (QUE / lógica) de $i
permanece igual, mientras que su dirección de memoria cambia a través de las diversas iteraciones de bucle. Pero no explica por qué en el ejemplo 2 el escalar empujado permanece atado a la misma identidad QUE en combinación con una dirección anterior ("448).
.WHERE
lugar de.WHICH
, puede ver que el escalar es en realidad un objeto diferente cada vez alrededor del bucle. Eso sucede porque los bloques puntiagudos se "llaman" y la firma se "vincula" en cada llamada.