es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué asignar muchas variables parece mutar mi variable?

Soy nuevo en Smalltalk, así que no sé si estoy haciendo algo mal, pero esto parece muy raro y con errores.

dict := Dictionary new.
dict at: 1 put: 1.
dict at: 2 put: 2.
dict at: 3 put: 3.
dict at: 4 put: 4.

Del 1 al 4 haz lo siguiente:

[:j |
key := j.
value := dict at: key.
value print.
value printNl.
].

Este código funciona bien e imprime correctamente:

11
22
33
44

Pero luego, si agrego suficientes asignaciones a otras variables, el resultado del script cambia:

dict := Dictionary new.
dict at: 1 put: 1.
dict at: 2 put: 2.
dict at: 3 put: 3.
dict at: 4 put: 4.

1 to: 4 do: [:j |
key := j.
value := dict at: key.
value print.
unrelated := 1.
unrelated2 := 1.
unrelated3 := 1.
unrelated4 := 1.
unrelated5 := 1.
unrelated6 := 1.
unrelated7 := 1.
unrelated8 := 1.
unrelated9 := 1.
unrelated10 := 1.
value printNl.
].

Ahora este código imprime:

11
21
31
41

Si elimino la línea que asigna unrelated10, funciona de nuevo… ¿Estoy omitiendo algo o GNU Smalltalk tiene errores?

Estoy usando la versión 3.2.5 de GNU Smalltalk.

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que este problema está relacionado con el recolector de basura de GNU Smalltalk. Cuando se agregan un número suficiente de asignaciones a otras variables, se activa el recolector de basura, lo que puede provocar un cambio en la asignación de memoria y afectar el comportamiento del objeto Dictionary.

    Para evitar este problema, puedes agregar una llamada manual al recolector de basura antes de usar el objeto Dictionary, de la siguiente manera:

    dict := Dictionary new.
    dict at: 1 put: 1.
    dict at: 2 put: 2.
    dict at: 3 put: 3.
    dict at: 4 put: 4.
    
    Smalltalk garbageCollect.
    
    1 to: 4 do: [:j |
      key := j.
      value := dict at: key.
      value print.
      unrelated := 1.
      unrelated2 := 1.
      unrelated3 := 1.
      unrelated4 := 1.
      unrelated5 := 1.
      unrelated6 := 1.
      unrelated7 := 1.
      unrelated8 := 1.
      unrelated9 := 1.
      unrelated10 := 1.
      value printNl.
    ].
    

    Esto asegurará que el recolector de basura se ejecute antes de usar el objeto Dictionary y evitará cualquier comportamiento inesperado. Sin embargo, debes tener en cuenta que llamar manualmente al recolector de basura puede tener implicaciones en el rendimiento, así que úsalo con moderación y solo cuando sea necesario.

Comments are closed.