Symbol テーブルに関するウィキペディアのエントリは参考になります。
http://en.wikipedia.org/wiki/Symbol_table
しかし、Ruby のシンボルと、それらがシンボル配列 (Symbol.all_symbols
メソッドによって返される) でどのように表現されるかを理解しようとすると、
シンボル テーブルに対する Ruby のアプローチに、他の言語との重要な違いがあるかどうか疑問に思っています。
Symbol テーブルに関するウィキペディアのエントリは参考になります。
http://en.wikipedia.org/wiki/Symbol_table
しかし、Ruby のシンボルと、それらがシンボル配列 (Symbol.all_symbols
メソッドによって返される) でどのように表現されるかを理解しようとすると、
シンボル テーブルに対する Ruby のアプローチに、他の言語との重要な違いがあるかどうか疑問に思っています。
Ruby には、その意味での「シンボル テーブル」はありません。これにはバインディングとシンボル (Lisp がアトムと呼ぶもの) がありますが、記事で説明されている方法で実際に行っているわけではありません。
したがって、あなたの質問への答えとして、ルビーが同じことを異なる方法で行うことはあまりありませんが、2つの異なることを行い(:xxx
表記->スコープ内の一意のIDとバインディング)、それらに類似した/重複する用語を使用しています.
明確にするために:
リンク先の記事では、シンボルテーブルの従来の定義を示しています。
プログラムのソース コード内の各識別子は、そのタイプ、スコープ レベル、場合によってはその場所など、ソース内での宣言または外観に関連する情報に関連付けられています。
しかし、これは ruby のシンボルテーブルが行うことではありません。:something
ソースコードのように記述できるオブジェクトの特定のクラスにグローバルに一意の ID を提供するだけで、識別子ではない:+
やなどを含みます。:"Hi bob!"
また、単に識別子を使用しても、対応するシンボルは作成されません。最後に、上記の文章にリストされている情報は、ruby のシンボルのリストには格納されていません。
命名の偶然であり、その記事を読んでも ruby のシンボルを理解するのに役立ちません。
最大の違いは、(Lisp と同様に) Ruby には実際にシンボルの構文があり、実行時に自分で簡単に追加/削除できることです。:balloon (または "balloon".intern) と言うと、それをインターンします。ソース内では名前で参照していますが、内部的にはシンボル テーブル内の単なるポインターです。シンボルを比較する場合、それは文字列比較ではなく単なるポインター比較です。
C のような言語には、実行時に単に「新しいシンボルを作成してください」と言う方法が実際にはありません。関数を定義することにより、コンパイル時に暗黙的に行うことができますが、実際にはそれが唯一の用途です。C にはシンボルの構文がないため、プログラム内で Balloon と言いたいが、それを 1 つの機械語命令と比較できるようにしたい場合は、enum (または #defines) を使用します。
Ruby では、シンボルを作成するのに 1 文字しかかからないため、あらゆる種類のもの (ハッシュ キーなど) に使用できます。
Ruby のシンボルは、他の言語が列挙型、定義、定数などを使用する傾向がある場所で使用されます。また、連想キーにもよく使用されます。それらの使用は、その記事で説明されているようにシンボル テーブルとはほとんど関係がありませんが、シンボル テーブルには明らかに存在します。