Techioz Blog

Rubyの「undef」オブジェクトとは何ですか?

概要

gc.c の MRI 実装では、undef という名前のオブジェクトが見つかりました。その undef オブジェクトとは何ですか?そのクラスは何ですか?どうすればアクセスできますか?何か実用性はあるのでしょうか?

解決策

これは私の推測に基づいたものですが、おそらく Matz がいつかこの質問を見て、最終的な答えをくれるでしょう。それまではそうなってくれることを願っています。

ご存知かもしれませんが、Ruby は少なくとも早い段階で Perl の影響を受けていました (これが、 や sh などの変数がある理由です)。 Perl には undef キーワード/関数があります (たとえば、初期化せずに変数を宣言すると、その値は未定義になります)。過去のある時点で、Ruby も同様のものを意図していたと思います (つまり、変数は未定義の値を持つことができます)。これをどうやって知ることができるのでしょうか?それが見つかったコンテキストによる。

ご覧のとおり、このコメントはさまざまな Ruby オブジェクトの object_id がどのように導出されるかを説明しています。詳細については、こちらをご覧ください。しかし、本質的には次のことがわかっています。

false.object_id == 0
true.object_id == 2
nil.object_id == 4

これはコメントが示唆していることであり、これは実際に当てはまります。irb セッションを開いて自分で試してみることができます。 undef の object_id は 6 であるようです。

さて、確かに undef は Ruby の予約語ですが、nil、false、true のような特別なオブジェクトではなく、ご存知のとおり、メソッドの定義を解除するために使用されるキーワードです。

したがって、あなたの質問に答えると、undef オブジェクトは存在せず、クラスがなく、アクセスできません。 undef が果たすべき目的は、代わりに、今日私たちが知っている Ruby の nil オブジェクトによって果たされます。しかし、それは過ぎ去った時代の遺産としてコードに残されており、好奇心旺盛な私たちが見つけて謎を解くことができます。