スコープを理解しているかどうかわかりません-スコープ外の変数(Rubyを使用しています)がメモリのどこかに存在するか、それとも存在しなくなりますか(アクセスできないことはわかっています)。範囲外の変数はもう存在しないと言うのは不正確でしょうか?
多分これは哲学的な問題です。
マネージ言語を使用している場合は、メモリが存在しない限り、メモリを割り当てたり割り当てを解除したりしません。
技術的にはそうですが、GC は決定論的ではない傾向があるため、実際にいつ消滅するかを技術的に判断するのは困難です。
変数は、それが保持する値と同じではありません。
変数自体は、スコープ外になると存在しなくなります。変数が保持する値はオブジェクトを表す場合があり、そのオブジェクトは変数の存続期間を超えて存在し続ける場合があります。ガベージ コレクターは後でオブジェクトを再利用します。
スコープ外になると、ガベージ コレクションによってクリーンアップされるまで、しばらくの間 (メモリが割り当てられているという意味で) まだ存在します。しかし、あなたが暗示しているように、その名前は失われ、到達できません。
変数が範囲外になったとき、それが悲鳴を上げるのを聞いた人はいますか?
これは Ruby に関する質問ではなく、ガベージ コレクションに関する一般的な質問です。Ruby や C# などのガベージ コレクション言語では、変数がスコープ外になると、使用されなくなったことを示す何らかの方法でマークされます。これが発生すると、もうそれを手に入れることができず、親指をいじって座っていますが、まだメモリが割り当てられています.
ある時点でガベージ コレクタが起動し、未使用としてマークされた変数を探します。それらは破棄され、その時点でそれらはまったくメモリにありません。
ガベージコレクタの動作によっては、これよりも複雑になる可能性がありますが、十分に近いです:)
ロブ・ケネディはこれに適切に答えていますが、もう少し詳細を追加すると思いました.
認識すべき重要なことは、変数とそれが表す値の違いです。
以下に例を示します (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|
スタイル ブロックを使用した場合、またはガベージ コレクションを取得した場合にのみ閉じます。これは、他のコード (または単体テスト) がそのファイルの内容を読み取ろうとして、まだフラッシュされていない場合に問題になる可能性があります。