Свыше 30 классов уже встроено в Ruby. Как и во многих других объектно-ориентированных
языках, в нем не допускается множественное наследование, но это
еще не означает, что язык стал менее выразительным. Современные языки часто
построены согласно модели одиночного наследования. Ruby поддерживает модули
и классы-примеси, которые мы обсудим в следующей главе. Также реализованы
идентификаторы объектов, что позволяет строить устойчивые, распределенные
и перемещаемые объекты.
Для создания объекта существующего класса обычно используется метод new:
myFile = File.new("textfile.txt","w")
myString = String.new("Это строковый объект")
Однако не всегда его обязательно вызывать явно. В частности, при создании
объекта string можно и не упоминать этот метод:
yourString = "Это тоже строковый объект"
aNumber =5 # и здесь метод new не нужен
Ссылки на объекты хранятся в переменных. Выше уже отмечалось, что сами
переменные не имеют типа и не являются объектами - они лишь ссылаются на
объекты.
Из этого правила есть исключение: небольшие неизменяемые объекты некоторых
встроенных классов, например Fixnum, непосредственно копируются в переменные,
которые на них ссылаются. (Размер этих объектов не превышает размера
указателя, поэтому хранить их таким образом более эффективно.) В таком случае
во время присваивания делается копия объекта, а куча не используется.
x = "abc"
При присваивании переменных ссылки на объекты обобществляются,
у = "abc"
х = у
х # "abc"
После выполнения присваивания х = у и х, и у ссылаются на один и тот же объект:
x.object_id # 53732208
y.object_id # 53732208
Если объект изменяемый, то модификация, примененная к одной переменной,
отражается и на другой:
x.gsub!(/а/,"х")
у # "xbc"
Однако новое присваивание любой из этих переменных не влияет на другую:
# Продолжение предыдущего примера
х = "abc"
у # по-прежнему равно "xbc"
Изменяемый объект можно сделать неизменяемым, вызвав метод freeze:
х. freeze
x.gsub!(/Ь/, "у") # Ошибка!
Символ в Ruby ссылается на переменную по имени, а не по ссылке. Во многих
случаях он может вообще не ссылаться на идентификатор, а вести себя как некая
разновидность неизменяемой строки. Символ можно преобразовать в строку с помощью
метода to_s.
Hearts = :Hearts # Это один из способов присвоить
Clubs = :Clubs # уникальное значение константе,
Diamonds = :Diamonds # некий аналог перечисления
Spades = :Spades # в языках Pascal или С.
puts Hearts.to^s # Печатается "Hearts"
Продемонстрированный выше фокус с «перечислением» был более осмыслен
на ранних этапах развития Ruby, когда еще не было класса Symbol, а наличие двоеточия
перед идентификатором превращало его в целое число. Если вы пользуетесь
таким трюком, не предполагайте, что фактическое значение символа будет неизменным
или предсказуемым - просто используйте его как константу, значение
которой неважно.
