Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
1.3.1. Объекты
В Ruby все числа, строки, массивы, регулярные выражения и многие другие сущности фактически являются объектами. Работа программы состоит в вызове методов разных объектов:
3.succ # 4"abc".upcase # "ABC"[2,1,5,3,4].sort # [1,2,3,4,5]someObject.someMethod # какой-то результатВ Ruby каждый объект представляет собой экземпляр какого-то класса. Класс содержит реализацию методов:
"abc".class # String"abc".class.class # ClassПомимо инкапсуляции собственных атрибутов и операций объект в Ruby имеет уникальный идентификатор:
"abc".object_id # 53744407Этот идентификатор объекта обычно не представляет интереса для программиста.
1.3.2. Встроенные классы
Свыше 30 классов уже встроено в Ruby. Как и во многих других объектно-ориентированных языках, в нем не допускается множественное наследование, но это еще не означает, что язык стал менее выразительным. Современные языки часто построены согласно модели одиночного наследования. Ruby поддерживает модули и классы-примеси, которые мы обсудим в следующей главе. Также реализованы идентификаторы объектов, что позволяет строить устойчивые, распределенные и перемещаемые объекты.
Для создания объекта существующего класса обычно используется метод
newmyFile = File.new("textfile.txt","w")myString = String.new("Это строковый объект")Однако не всегда его обязательно вызывать явно. В частности, при создании объекта String можно и не упоминать этот метод:
yourString = "Это тоже строковый объект"aNumber =5 # и здесь метод new не нуженСсылки на объекты хранятся в переменных. Выше уже отмечалось, что сами переменные не имеют типа и не являются объектами — они лишь ссылаются на объекты.
x = "abc"Из этого правила есть исключение: небольшие неизменяемые объекты некоторых встроенных классов, например
FixnumПри присваивании переменных ссылки на объекты обобществляются.
y = "abc"x = yx # "abc"После выполнения присваивания
x = yxyx.object_id # 53732208y.object_id # 53732208Если объект изменяемый, то модификация, примененная к одной переменной, отражается и на другой:
x.gsub!(/а/, "x")y # "хbс"Однако новое присваивание любой из этих переменных не влияет на другую:
# Продолжение предыдущего примераx = "abc"y # по-прежнему равно "хbс"Изменяемый объект можно сделать неизменяемым, вызвав метод
freezex.freezex.gsub!(/b/,"y") # Ошибка!Символ в Ruby ссылается на переменную по имени, а не по ссылке. Во многих случаях он может вообще не ссылаться на идентификатор, а вести себя как некая разновидность неизменяемой строки. Символ можно преобразовать в строку с помощью метода
to_sHearts = :Hearts # Это один из способов присвоитьClubs = :Clubs # уникальное значение константе,Diamonds = :Diamonds # некий аналог перечисленияSpades = :Spades # в языках Pascal или С.puts Hearts.to_s # Печатается "Hearts"Продемонстрированный выше фокус с «перечислением» был более осмыслен на ранних этапах развития Ruby, когда еще не было класса
Symbol1.3.3. Модули и классы-примеси
Многие встроенные методы наследуются от классов-предков. Особо стоит отметить методы модуля
KernelObjectObjectKernelТермины «модуль» и «примесь» — почти синонимы. Модуль представляет собой набор методов и констант, внешних по отношению к программе на Ruby. Его можно использовать просто для управления пространством имен, но основное применение модулей связано с «подмешиванием» его возможностей в класс (с помощью директивы
includeЭтот термин очевидно заимствован из языка Python. Стоит отметить, что в некоторых вариантах LISP такой механизм существует уже больше двадцати лет.
Не путайте описанное выше употребление термина «модуль» с другим значением, которое часто придается ему в информатике. Модуль в Ruby — это не внешний исходный текст и не двоичный файл (хотя может храниться и в том, и в другом виде). Это объектно-ориентированная абстракция, в чем-то похожая на класс.
Примером использования модуля для управления пространством имен служит модуль
MathMathinclude;Math::PIПримесь дает способ получить преимущества множественного наследования, не отягощенные характерными для него проблемами. Можно считать, что это ограниченная форма множественного наследования, но создатель языка Мац называет его одиночным наследованием с разделением реализации.
Отметим, что предложение
includeextendincludeextend
