6.1. Символы

6.1. Символы

Символ в Ruby — это экземпляр класса Symbol. Синтаксически он обычно обозначается двоеточием (:), за которым следует идентификатор.

Символ похож на строку, он тоже соответствует последовательности символов. Отличие от строки состоит в том, что у каждого символа есть только один экземпляр (как и в случае с объектами Fixnum). Следовательно, имеет место проблема потребления памяти или производительности, о которой нужно помнить. Например, в нижеприведенном коде строка "foo" представлена в памяти тремя различными объектами, а символ :foo — одним, на который есть несколько ссылок:

array = ["foo", "foo", "foo", :foo, :foo, :foo]

Некоторых смущает двоеточие перед именем символа. Не волнуйтесь, это всего лишь синтаксическое соглашение. У строк, массивов и хэшей есть начальный и конечный ограничители, а у символов - только начальный. Считайте, что это унарный, а не бинарный ограничитель. На первый взгляд синтаксис кажется странным, но ничего таинственного в нем нет.

Стоит отметить, что в старых версиях Ruby (до 1.6) символьные константы были полноценными объектами, поскольку преобразовывались в Fixnum и в таком виде хранились. Внутреннее представление осталось таким же; символу ставится в соответствие число, и хранится он как непосредственное значение. Само число можно получить, вызвав метод to_i, но в этом редко возникает необходимость.

По словам Джима Вайриха, символ — это «объект, у которого есть имя». Остин Зиглер предпочитает говорить об «объекте, который сам является именем». Как бы то ни было, существует взаимно однозначное соответствие между символами и именами. К чему можно применить имена? Например, к переменным, методам и произвольным константам.

Типичное применение символов — для представления имени переменной или метода. Например, чтобы добавить в класс атрибут, допускающий чтение и изменение, можно поступить следующим образом:

class SomeClass

 attr_accessor :whatever

end

To же самое можно выразить иначе:

class SomeClass

 def whatever

  @whatever

 end

 def whatever=(val)

  @whatever = val

 end

end

Другими словами, символ :whatever говорит методу attr_accessor, что методам чтения и установки (а равно и самой переменной экземпляра) следует присвоить имена, определяемые указанным символом.

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

attr_reader :alpha

attr_reader "beta" # Так тоже можно.

На самом деле символ «похож» на строку в том смысле, что ему соответствует последовательность символов. Поэтому некоторые говорят, что «символ — это просто неизменяемая строка». Но класс Symbol не наследует классу String, а типичные операции над строками необязательно применимы к символам.

Также неправильно думать, что символы напрямую соответствуют идентификаторам. Из-за этого непонимания некоторые говорят о «таблице символов» (как если бы речь шла об ассемблированном объектном коде). В действительности это представление бессмысленно; хотя символы и хранятся в какой-то внутренней таблице (а как же иначе?), Ruby не дает к ней доступа, поэтому программистам все равно, существует она или нет.

Более того, символы даже не всегда выглядят как идентификаторы. Обычно это так, что бы под этим ни понимать, но символ может содержать и знаки препинания, если заключен в кавычки. Все показанные ниже символы допустимы:

sym1 = :"This is a symbol"

sym2 = :"This is, too!"

sym3 = :")(*&^%$" # И даже такой.

Можно даже использовать символы для определения переменных и методов экземпляра, но тогда для ссылки на них пришлось бы применять такие методы, как send и instance_variable_get. Вообще говоря, такая практика не рекомендуется.

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Похожие главы из других книг:

13.4.1. Широкие символы

Из книги автора

13.4.1. Широкие символы Мы начнем с концепции широких символов (wide character). Широкий символ является целым типом, в котором может храниться любое значение из определенного используемого многобайтного набора символов.Широкие символы представлены на С типом wchar_t. C99


Отладочные символы

Из книги автора

Отладочные символы Большинство программ и библиотек по умолчанию компилируются с символами отладки. ( с опцией gcc -g).При отладке программы или библиотеки, скомпилированной с отладочной информацией, отладчик предоставляет не только адреса в памяти, но и имена алгоритмов и


Символы

Из книги автора

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


6.1. Символы

Из книги автора

6.1. Символы Символ в Ruby — это экземпляр класса Symbol. Синтаксически он обычно обозначается двоеточием (:), за которым следует идентификатор.Символ похож на строку, он тоже соответствует последовательности символов. Отличие от строки состоит в том, что у каждого символа есть


6.1.1. Символы как перечисления

Из книги автора

6.1.1. Символы как перечисления В языке Pascal и в поздних версиях С есть понятие перечисляемого типа. В Ruby ничего подобного быть не может, ведь никакого контроля типов не производится. Но символы часто используются как мнемонические имена; стороны света можно было бы


6.1.2. Символы как метазначения

Из книги автора

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


Символы

Из книги автора

Символы Эти знаки соответствуют типографским символам, таким, как А, &, + и т. п. Обычно под каждый символ отводится 1 байт памяти.Char: ключевое слово, используемое для указания данных этого типа. Данные этих типов могут принимать положительные и отрицательные


1. Металингвистические символы

Из книги автора

1. Металингвистические символы При описании синтаксических конструкций, использующихся в записи оператора создания базового отношения на псевдокоде, применяются различные металингвистические символы. Это всевозможные открывающие и закрывающие скобки, разнообразные


Пробельные символы

Из книги автора

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


Специальные символы

Из книги автора

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


Специальные символы

Из книги автора

Специальные символы Элементы (ключевые слова, параметры), которые обязательны во всех случаях, появляются без каких-либо дополнительных пометок, они выделены таким шрифтом, как и весь код в книге. В предыдущем примере ключевые слова SELECT и FROM являются обязательными для


6.1.3. Форматируем символы

Из книги автора

6.1.3. Форматируем символы Для выполнения заданий нам понадобится материал разд. 5.1.4 и 5.1.5. Задание № 11. Открыть файл упр. pages, перейти на пустую страницу документа, вставив разрыв в конце последней строки аналогично предыдущему разделу.2. Набрать с клавиатуры фамилию, имя,