Cuando una variable queda fuera del scope, ¿significa que no existe?

No estoy seguro de entender el scope: ¿existe una variable fuera de scope (estoy usando Ruby) en algún lugar de la memoria o deja de existir (sé que no puedes acceder a ella)? ¿Sería impreciso decir que una variable fuera de scope ya no existe?

Tal vez esta es una pregunta filosófica.

Si está utilizando un lenguaje administrado, entonces no asigna ni desasigna la memoria, por lo que a usted le parece que ya no existe.

Técnicamente lo hace, pero los GC tienden a no ser deterministas, por lo que técnicamente es difícil decir cuándo desaparece.

Una variable no es lo mismo que el valor que tiene.

La propia variable deja de existir cuando se sale del ámbito de aplicación. El valor que la variable mantuvo puede representar un objeto, y ese objeto puede continuar existiendo más allá del tiempo de vida de la variable. El recolector de basura recupera el objeto más tarde.

Cuando está fuera del scope, todavía existe (en el sentido de que tiene algo de memoria asignada) por algún tiempo, hasta que la recolección de basura lo limpia. Pero como insinuas, ha perdido su nombre y es inalcanzable.

Cuando una variable cae fuera del scope, ¿hay alguien alrededor que la oiga gritar?

Esto no es tanto una pregunta de Ruby como una pregunta general sobre la recolección de basura. En un lenguaje de recolección de basura como Ruby o C # cuando una variable queda fuera del scope, está marcada de alguna manera que dice que ya no está en uso. Cuando esto sucede, ya no puedes seguir con eso y se sienta girando sus pulgares, pero todavía tiene memoria asignada.

En algún momento, el recolector de basura se activará y buscará las variables marcadas como no utilizadas. Los desechará y en ese momento ya no estarán en la memoria.

Puede ser más complicado que esto, dependiendo de cómo funciona el recolector de basura, pero está lo suficientemente cerca 🙂

Existe por un tiempo hasta que el recolector de basura lo deseche (si es posible).

Rob Kennedy respondió correctamente, pero pensé que agregaría un poco más de detalles.

Lo importante a reconocer es la diferencia entre una variable y el valor que representa.

Aquí hay un ejemplo (en C # porque no conozco a Ruby):

 object c = null; if (1 == 1) // Just to get a different scope { var newObj = new SomeClass(); newObj.SomeProperty = true; c = newObj; } 

En el código anterior, newObj queda fuera del scope al final de la instrucción if y, como tal, “no existe”, pero el valor al que se refería sigue vivo y bien, al que hace referencia c. Una vez que todas las referencias al objeto hayan desaparecido, el recolector de basura se encargará de limpiarlo.

Si estás hablando de objetos de archivo, se convierte en algo más que una pregunta filosófica. Si recuerdo correctamente, los archivos no se cierran automáticamente cuando están fuera del scope, solo se cierran si les pides que cierren o si usas un File.open do |file| Bloque de estilo, o si se recogen basura. Esto puede ser un problema si otro código (o pruebas de unidad) intenta leer el contenido de ese archivo y aún no se ha vaciado.