Pergunta

Eu não tenho certeza se entendi escopo - faz uma variável fora do escopo (estou usando Ruby) existem em algum lugar da memória ou ele deixar de existir (eu sei que você não pode acessá-lo). seria impreciso dizer que uma variável fora do escopo não existe mais?

Talvez esta seja uma questão filosófica.

Foi útil?

Solução

Se você estiver usando linguagem gerenciada, então você não alocar e liberar memória desaloco assim, tanto quanto você está preocupado que não existe mais.

Tecnicamente, ele faz, mas GCs tendem a não ser determinista então tecnicamente é difícil dizer quando ele realmente desaparece.

Outras dicas

A variável não é o mesmo que o valor que detém.

A variável em si deixa de existir quando ele sai do escopo. O valor que a variável realizada pode representar um objeto e esse objeto pode continuar a existir para além da vigência da variável. O coletor de lixo recupera o objeto mais tarde.

Quando se sai do escopo ainda existe (no sentido de que ele tem alguma memória alocada a ele) por algum tempo, até que a coleta de lixo limpa-lo. Mas, como você implica, é perdido do nome e está inacessível.

Quando uma variável cai fora do escopo é qualquer pessoa ao redor de ouvi-lo gritar?

Esta não é uma questão de rubi tanto como uma questão geral sobre coleta de lixo. Em uma linguagem recolhidos lixo como Ruby ou C # quando uma variável cai fora do escopo é marcado de alguma maneira que diz que ele não é mais em uso. Quando isso acontece, você não pode chegar a ela mais e senta-se em torno girando seus polegares -. Mas ainda tem memória alocada para ele

Em algum momento o coletor de lixo vai acordar e olhar para as variáveis ??marcadas como não em uso. Ele vai eliminá-los e nesse ponto eles já não na memória está em todos.

Ele pode ser mais complicado do que isso, dependendo de como funciona o coletor de lixo, mas é perto o suficiente:)

Ela existe para um pouco até que os descarta coletor de lixo (se ele pode).

Rob Kennedy tem este respondeu de forma adequada, mas eu pensei que eu gostaria de acrescentar um pouco mais de detalhes.

O importante é reconhecer a diferença entre uma variável e o valor que representa.

Aqui está um exemplo (em C #, porque eu não sei o Ruby):

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

No código acima, NEWOBJ sai do escopo no final da instrução if e, como tal, "não existe", mas o valor que ele estava se referindo ainda está vivo e bem, referenciado por c. Depois de todas as referências para o objeto se foram, em seguida, o coletor de lixo vai cuidar de limpá-lo.

Se você está falando de objetos de arquivo, torna-se mais de uma questão filosófica. Se bem me lembro, os arquivos não se fecham automaticamente quando eles saem de escopo - eles só perto se você pedir-lhes para fechar, ou se você usar um bloco estilo File.open do |file|, ou se estes se lixo coletado. Isso pode ser um problema se outro código (ou testes de unidade) tentar ler o conteúdo desse arquivo e ele ainda não foi liberado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top