1.3.5. Методы и атрибуты

1.3.5. Методы и атрибуты

Как мы уже видели, методы обычно используются в сочетании с простыми экземплярами классов и переменными, причем вызывающий объект отделяется от имени метода точкой (receiver.method). Если имя метода является знаком препинания, то точка опускается. У методов могут быть аргументы:

Time.mktime(2000, "Aug", 24, 16, 0)

Поскольку каждое выражение возвращает значение, то вызовы методов могут сцепляться:

3.succ.to_s

/(x.z).*?(x.z).*?/.match("x1z_1a3_x2z_1b3_").to_a[1..3]

3+2.succ

Отметим, что могут возникать проблемы, если выражение, являющееся результатом сцепления, имеет тип, который не поддерживает конкретный метод. Точнее, при определенных условиях некоторые методы возвращают nil, а вызов любого метода от имени такого объекта приведет к ошибке. (Конечно, nil — полноценный объект, но он не обладает теми же методами, что и, например, массив.)

Некоторым методам можно передавать блоки. Это верно для всех итераторов — как встроенных, так и определенных пользователем. Блок обычно заключается в операторные скобки do-end или в фигурные скобки. Но он не рассматривается так же, как предшествующие ему параметры, если таковые существуют. Вот пример вызова метода File.open:

my_array.each do |x|

 some_action

end

File.open(filename) { |f| some_action }

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

Методы могут принимать переменное число аргументов:

receiver.method(arg1, *more_args)

В данном случае вызванный метод трактует more_args как массив и обращается с ним, как с любым другим массивом. На самом деле звездочка в списке формальных параметров (перед последним или единственным параметром) может «свернуть» последовательность фактических параметров в массив:

def mymethod(a, b, *с)

 print a, b

 с.each do |x| print x end

end

mymethod(1,2,3,4,5,6,7)

# a=1, b=2, c=[3,4,5,6,7]

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

Вот пример определения синглетного метода для строкового объекта:

str = "Hello, world!"

str2 = "Goodbye!"

def str.spell

 self.split(/./).join("-")

end

str.spell # "H-e-l-l-o-,- -w-o-r-l-d-!"

str2.spell # Ошибка!

Имейте в виду, что метод определяется для объекта, а не для переменной. Теоретически с помощью синглетных методов можно было бы создать систему объектов на базе прототипов. Это менее распространенная форма ООП без классов[5]. Основной структурный механизм в ней состоит в конструировании нового объекта путем использования существующего в качестве образца; новый объект ведет себя как старый за исключением тех особенностей, которые были переопределены. Тем самым можно строить системы на основе прототипов, а не наследования. Хотя у нас нет опыта в этой области, мы полагаем, что создание такой системы позволило бы полнее раскрыть возможности Ruby.

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



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

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

5.2.4. Атрибуты

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

5.2.4. Атрибуты Расширенное ключевое слово attribute используется для передачи gcc большего объема информации о функции, переменной или объявленном типе, чем это позволяет код С, соответствующий стандарту ANSI/ISO. Например, атрибут aligned дает указание gcc о том, как именно выравнивать


10.2 Атрибуты процессов

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

10.2 Атрибуты процессов 10.2.1. Идентификатор процесса и происхождение Два из наиболее фундаментальных атрибутов — это идентификатор процесса (process ID), или pid, а также идентификатор его родительского процесса. Идентификатор pid — это положительное целое число, которое


Атрибуты писем.

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

Атрибуты писем. Помимо указанных выше полей, заполняемых вручную или автоматически, используется также поле атрибутов письма. Hетмайл-письмо может иметь следующие атрибуты :Hазвание Сокращение ЗначениеPrivate Pvt Частное письмо. Если Вы пишете пользователю BBS, получающему


Атрибуты процесса

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

Атрибуты процесса Процесс в UNIX имеет несколько атрибутов, позволяющих операционной системе эффективно управлять его работой, важнейшие из которых рассмотрены


Атрибуты и свойства

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

Атрибуты и свойства Иногда бывает полезно показать, что объект имеет некие открытые свойства, которые могут быть доступны и/или которые можно модифицировать через СОМ-интерфейс. СОМ IDL позволяет аннотировать методы интерфейса с тем, чтобы данный метод либо


4. Виртуальные атрибуты

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

4. Виртуальные атрибуты Все атрибуты в системах управления базами данных делятся (по абсолютной аналогии с отношениями) на базовые и виртуальные. Так называемые базовые атрибуты – это хранимые атрибуты, которые необходимо использовать не один раз, а следовательно,


4.1.5. Атрибуты потоков

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

4.1.5. Атрибуты потоков Потоковые атрибуты — это механизм настройки поведения отдельных потоков. Вспомните, что функция pthread_create() принимает аргумент, являющийся указателем на объект атрибутов потока. Если этот указатель равен NULL, поток конфигурируется на основании


Атрибуты блока

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

Атрибуты блока Атрибут блока представляет собой некое подобие метки или ярлыка, используемых для связывания с блоком текстовой строки или каких-либо иных данных. В процессе вставки блока с переменными атрибутами AutoCAD предлагает ввести значение атрибута, которое затем


2.2.2. Сущности м атрибуты

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

2.2.2. Сущности м атрибуты Основные компоненты диаграммы Erwin - это сущности, атрибуты и связи. Каждая сущность является множеством подобных индивидуальных объектов, называемых экземплярами. Каждый экземпляр индивидуален и должен отличаться от всех остальных экземпляров.


1.1.8 Атрибуты окна

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

1.1.8 Атрибуты окна Многие атрибуты окна задаются при его создании с помощью процедуры XCreateWindow() или XCreateSimpleWindow(). Впоследствии параметры можно изменить, обратившись к процедуре XChangeWindowAttributes().Характеристики окна описываются структурами типа TXSetWindowAttributes и TXWindowAttributes.


Атрибуты

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

Атрибуты Сведения об атрибутах XSLT представлены в табл. П2.2.Таблица П2.2. Атрибуты XSLT Атрибут Назначение xsl:version Указывает версию языка в случае использования упрощенного синтаксиса записи преобразований xsl:exclude-result-prefixes Перечисляет префиксы пространств имен, которые


7.5. Атрибуты файлов

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

7.5. Атрибуты файлов Для каждого файла можно установить четыре атрибута (рис. 49):Только чтение — файл нельзя изменить, пока данный атрибут не сброшен.Скрытый — файл не будет отображаться при выводе содержимого каталога, пока не будет включен режим отображения скрытых


Атрибуты и подпрограммы

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

Атрибуты и подпрограммы Любой абстрактный тип данных и POINT в частности характеризуется набором функций, описывающих операции применимые к экземплярам АТД. В классе, реализующем АТД, функции становятся компонентами (features) - операциями, применимыми к экземплярам класса.В


Атрибуты или функции?

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

Атрибуты или функции? Рассмотрим подробнее следствия принципа унифицированного доступа и объединения атрибутов и подпрограмм под общим заголовком - компоненты. (См."Унифицированный доступ", лекция 3. См. также данную лекцию.)Принцип декларирует, что клиенты модуля


У18.4 Однократные атрибуты?

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

У18.4 Однократные атрибуты? Исследуйте полезность понятия "однократного атрибута", полученного по образцу однократной функции? Будет ли такой атрибут общим для всех экземпляров класса? Как инициализировать однократные атрибуты? Являются ли они избыточными при наличии