Отличается ли таблица символов в Ruby от таблицы символов на других языках? - PullRequest
2 голосов
/ 20 марта 2009

Хорошая ссылка на статью в Википедии о таблицах символов:

http://en.wikipedia.org/wiki/Symbol_table

Но поскольку я пытаюсь понять символы в Ruby и то, как они представлены в массиве символов (возвращаемых методом Symbol.all_symbols),

Мне интересно, имеет ли подход Руби к таблице символов какие-либо важные отличия от других языков?

Ответы [ 3 ]

6 голосов
/ 20 марта 2009

В этом смысле у Ruby нет «таблицы символов». У него есть привязки и символы (то, что Лисперс называет атомами ), но на самом деле это не так, как описано в статье.

Итак, в ответ на ваш вопрос: дело не в том, что ruby ​​выполняет одно и то же по-разному, а в том, что он делает две разные вещи (:xxx запись -> уникальные идентификаторы и привязки в областях) и использует похожая / перекрывающаяся терминология для них.

Для уточнения:

Статья, на которую вы ссылаетесь, дает обычное определение таблицы символов, то есть

, где каждый идентификатор в исходном коде программы связан с информацией, относящейся к ее объявлению или появлению в источнике, такой как его тип, уровень области действия и иногда его местоположение

Но это не то, что делает таблица символов ruby. Он просто предоставляет глобально уникальную идентификацию для определенного класса объектов, который может быть записан как :something в исходном коде, включая такие вещи, как :+ и :"Hi bob!", которые не являются идентификаторами. Кроме того, простое использование идентификатора не создаст соответствующий символ. И, наконец, никакая информация, перечисленная в приведенном выше отрывке, не сохраняется в списке символов ruby.

Это совпадение имен, и чтение этой статьи не поможет вам понять символы рубина.

1 голос
/ 20 марта 2009

Символы в Ruby используются там, где другие языки, как правило, используют перечисления, определения, константы и тому подобное. Они также часто используются для ассоциативных ключей. Их использование имеет мало общего с таблицей символов, как обсуждалось в этой статье, за исключением того, что они явно существуют в одной.

1 голос
/ 20 марта 2009

Самое большое отличие состоит в том, что (как и в Lisp) Ruby на самом деле имеет синтаксис для символов, и его легко добавлять / удалять во время выполнения самостоятельно. Если вы скажете: воздушный шар (или «воздушный шар» .intern), он будет работать для вас. Даже если вы ссылаетесь на это по имени в вашем источнике, внутренне это просто указатель в таблице символов. Если вы сравниваете символы, это просто сравнение указателей, а не сравнение строк.

Такие языки, как C, на самом деле не могут просто сказать «создай новый символ для меня» во время выполнения. Вы можете сделать это неявно во время компиляции, определив функцию, но это действительно ее единственное использование. Поскольку C не имеет синтаксиса для символов, если вы хотите иметь возможность произносить Balloon в своей программе, но иметь возможность сравнивать его с одной машинной инструкцией, вы используете перечисления (или #defines).

В Ruby для создания символа требуется только один символ, так что вы можете использовать его для любых вещей (например, для хеш-ключей).

...