変数がスコープから外れると、それは存在しないということですか?
質問
スコープを理解しているかどうかわかりません-スコープ外の変数(Rubyを使用しています)がメモリのどこかに存在するか、既存のものを停止しますか(アクセスできないことはわかっています)。 範囲外の変数がもう存在しないと言うのは不正確ですか?
これは哲学的な質問かもしれません。
解決
マネージ言語を使用している場合、メモリが存在しないという懸念がある限り、メモリの割り当てと割り当て解除は行いません。
技術的にはそうですが、GCは決定論的ではない傾向があるため、技術的には実際に消失することを言うのは困難です。
他のヒント
変数は、保持する値とは異なります。
変数自体は、スコープ外になると存在しなくなります。変数が保持する値はオブジェクトを表し、そのオブジェクトは変数の存続期間を超えて存在し続ける可能性があります。ガベージコレクターは後でオブジェクトを回収します。
ガベージコレクションがクリーンアップするまで、スコープ外に出てもしばらく(メモリが割り当てられているという意味で)存在します。しかし、あなたが暗示するように、それはその名前を失い、到達不能です。
変数が範囲外になったとき、誰かがそれを叫ぶのを聞いていますか?
これは、ガベージコレクションに関する一般的な質問ほどルビーの質問ではありません。 RubyやC#などのガベージコレクションされた言語では、変数がスコープから外れると、変数は使用されなくなったというマークが付けられます。これが起こると、あなたはもうそれを取得することができず、親指をいじり回しますが、まだ割り当てられたメモリがあります。
ある時点で、ガベージコレクターが起動し、使用されていないとマークされた変数を探します。それはそれらを破棄し、その時点でそれらはもはやメモリにありません。
ガベージコレクタの動作方法によっては、これよりも複雑になる可能性がありますが、十分に近いです:)
ガベージコレクタが破棄するまで(存在する場合)、少しの間存在します。
Rob Kennedyはこれに適切に答えましたが、もう少し詳細を追加すると思いました。
認識すべき重要なことは、変数とそれが表す値の違いです。
例を示します(Rubyを知らないためC#で):
object c = null;
if (1 == 1) // Just to get a different scope
{
var newObj = new SomeClass();
newObj.SomeProperty = true;
c = newObj;
}
上記のコードでは、newObjはifステートメントの終わりにスコープから出て「存在しない」のですが、それが参照していた値はまだ有効であり、cによって参照されています。オブジェクトへの参照がすべてなくなると、ガベージコレクターがオブジェクトのクリーンアップを処理します。
ファイルオブジェクトについて話しているのであれば、それは哲学的な質問以上のものになります。正しく思い出すと、ファイルはスコープから外れても自動的に閉じません。閉じるように要求した場合、または File.open do | file |
スタイルブロックを使用した場合にのみ閉じます。ガベージコレクションが行われる場合。これは、他のコード(または単体テスト)がそのファイルの内容を読み取ろうとしていて、まだフラッシュされていない場合に問題になる可能性があります。