ID

ID は、インタプリタプロセス寿命の中で、文字列に一意な数値をつけるもの、と述べた。例えば "hello" に 100 という数値を付けたら、プロセスが再起動するまでずっと 100 になる。

(C) 文字列 -> ID への変換は、rb_intern(const char *) で行う。引数は String ではない。逆は、rb_id2name(ID) だ。

何に使うかというと、いろいろなところで使うのだけれど、例えばメソッド名などの探索で、いちいち文字列一致を行うと、比較の度に文字数 n に比例するコストがかかることになるが、メソッド名をすべて数値に置き換えておけば、数値の比較、すなわち O(1) の比較で済むことになる。論理的には Bignum に拡張するようなことになれば、O(n) になるけど、インタプリタ内であれば、まぁ常識的に考えて、そうはならない。なお、現在 ID は、たしか 29 bit (つまり 229 = 536,870,912)の上限がある。例えば、600M 個のメソッドを作るとインタプリタプロセスが死ぬ。