Pregunta

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

Tal vez esta es una pregunta filosófica.

¿Fue útil?

Solución

Si está usando 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 realmente.

Otros consejos

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

La variable en sí misma deja de existir cuando está fuera de alcance. El valor que la variable retenida 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 de alcance, 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 insinúa, se pierde su nombre y es inalcanzable.

Cuando una variable cae fuera del alcance, ¿hay alguien alrededor para escucharla gritar?

Esto no es tanto una pregunta de rubí 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 alcance, está marcada de alguna manera que dice que ya no está en uso. Cuando esto sucede, ya no puedes seguir con el tema y se queda girando sobre sus pulgares, pero aún 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 un poco hasta que el recolector de basura lo elimine (si puede).

Rob Kennedy ha respondido esto adecuadamente, 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 alcance al final de la instrucción if y, como tal, "no existe", pero el valor al que se refería sigue vivo y bien, referenciado por 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 alcance; solo se cierran si les pide que cierren, o si usa un bloque de estilo File.open do | file | , o Si consiguen la basura recogida. 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.

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