Символы - это тип данных в Smalltalk, очень похожий на строки.
Символ записывается как #someSymbol
(решётка, записанная слитно со словом), например #top
, #doesNotUnderstand
.
Символ - это объект класса Symbol, являющегося потомком класса String. В отличии от строк, символы уникальны. То есть, два равных (эквивалентных) символа всегда идентичны друг другу: если aSymbol1 = aSymbol2
, то и aSymbol1 == aSymbol2
. Или, говоря другими словами, равенство символов можно проверит сравнением объектных указателей.
Именно из-за свойства "уникальности" символы очень активно используются в "низкоуровневом" программировании на Smalltalk (например, названия классов и методов - это символы). Например, при поиске метода ВМ ищет метод класса с селектором метода равным заданному. При этом нельзя сравнивать селекторы на равенство, так как это рекурсивно вызовет поиск метода #=
. По-этому ВМ сравнивает идентичность селекторов.
Кроме того символы часто используются, когда в качестве параметра надо передать один из нескольких заранее определённых вариантов (например, #top
или #bottom
).
Довольно близким аналогом символов являются interned String в Java или символ LISP.