11.2.1. Отправка объекту явного сообщения

11.2.1. Отправка объекту явного сообщения

В статическом языке вы считаете очевидным, что имя вызываемой функции «зашито» в программу, это часть исходного текста. Динамический язык обладает в данном отношении большей гибкостью.

При любом вызове метода вы посылаете объекту сообщение. Обычно эти сообщения так же жестко «зашиты» в код, как и в статическом языке, но это необязательно. Можно написать программу, которая во время выполнения решает, какой метод вызывать. Метод send позволяет использовать Symbol для представления имени метода.

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

Этот пример был написан для первого издания книги. Теперь метод sort_by стал стандартным и даже более эффективным, поскольку реализует преобразование Шварца (по имени известного гуру в языке Perl Рэндала Шварца) и сохраняет преобразованные значения вместо многократного их вычисления. Впрочем, листинг 11.9 по-прежнему дает пример использования метода send.

Листинг 11.9. Сортировка по любому ключу

class Person

 attr_reader :name, :age, :height

 def initialize(name, age, height)

  @name, @age, @height = name, age, height

 end

 def inspect

  "#@name #@age #@height"

 end

end

class Array

 def sort_by(sym) # Наш вариант метода sort_by.

  self.sort {|x,y| x.send(sym) <=> y.send(sym) }

 end

end

people = []

people << Person.new("Hansel", 35, 69)

people << Person.new("Gretel", 32, 64)

people << Person.new("Ted", 36, 68)

people << Person.new("Alice", 33, 63)

p1 = people.sort_by(:name)

p2 = people.sort_by(:age)

p3 = people.sort_by(:height)

p p1 # [Alice 33 63, Gretel 32 64, Hansel 35 69, Ted 36 68]

p p2 # [Gretel 32 64, Alice 33 63, Hansel 35 69, Ted 36 68]

p p3 # [Alice 33 63, Gretel 32 64, Ted 36 68, Hansel 35 69]

Отметим еще, что синоним __send__ делает в точности то же самое. Такое странное имя объясняется, вероятно, опасением, что имя send уже может быть задействовано (случайно или намеренно) для определенного пользователем метода.

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

Следующая глава >

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

Создание и отправка нового сообщения

Из книги Мобильный интернет автора Леонтьев Виталий Петрович

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


Отправка сообщения с мобильного телефона

Из книги Компьютер + мобильник: эффективное взаимодействие автора Гольцман Виктор Иосифович

Отправка сообщения с мобильного телефона Итак, чтобы отправить MMS-сообщение с мобильного телефона другому абоненту, нужно настроить телефон определенным образом. Дать подробные инструкции по поводу настройки телефона не представляется возможным из-за различия моделей.


Отправка сообщения с сайта

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Отправка сообщения с сайта Теперь посмотрим, как сделать то же самое, но уже с сайта в Интернете. Если вы хотите оправить MMS-сообщение с сайта на мобильный телефон, выполните следующее.1. Перейдите на страницу отправки MMS на сайте www.smsline.ru. Для этого нужно щелкнуть кнопкой


Отправка SMS

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Отправка SMS Все давно уже привыкли к SMS. В программе Skype сообщения посылаются не только с помощью чата, существует специальная функция отправки SMS. Однако это возможно только для тех контактов, которые содержат номера мобильных телефонов. Для того чтобы иметь возможность


Варианты явного преобразования для типа Square

Из книги Office 2007. Мультимедийный курс автора Мединов Олег

Варианты явного преобразования для типа Square Теперь вы можете явно превращать прямоугольники в квадраты, но рассмотрим еще несколько вариантов явного преобразования. Поскольку у квадрата стороны равны, можно явно преобразовать System.Int32 в Square (длина стороны квадрата будет


Доступ к объекту Graphics вне обработчика Paint

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

Доступ к объекту Graphics вне обработчика Paint В некоторых редких случаях может понадобиться доступ к объекту Graphics вне контекста обработчика события Paint. Предположим, например, что нужно перерисовать небольшой круг с центром в точке (х, у), где был выполнен щелчок кнопки мыши.


Создание и отправка почтового сообщения

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Создание и отправка почтового сообщения Чтобы создать новое почтовое сообщение, выполните команду главного меню Файл ? Создать ? Сообщение или Действие ? Создать сообщение либо нажмите комбинацию клавиш Ctrl+N. При выполнении любого из перечисленных действий открывается


Присоединение ссылки к объекту

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Присоединение ссылки к объекту Классы, появляющиеся в этой лекции, не имели подпрограмм - у них были только атрибуты. Как отмечалось, такие классы почти бесполезны, так как у них нет способа изменить значение атрибутов. Необходимы способы модификации ссылок, не


90. Избегайте явного выбора типов — используйте полиморфизм

Из книги C++ для начинающих автора Липпман Стенли

90. Избегайте явного выбора типов — используйте полиморфизм РезюмеИзбегайте явного выбора типа объекта для настройки поведения. Используйте шаблоны и виртуальные функции для того, чтобы поведение объекта определялось его типом, а не вызывающим


Отправка по TCP

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

Отправка по TCP Приняв все вышеизложенные термины и определения, посмотрим на рис. 2.15, где показано, что происходит, когда приложение записывает данные в сокет TCP. Рис. 2.15. Этапы записи данных в сокет TCP и буферы, используемые при этой записиУ каждого сокета TCP есть буфер


Отправка по UDP

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

Отправка по UDP На рис. 2.16 показано, что происходит, когда приложение записывает данные в сокет UDP. Рис. 2.16. Отправка данных через сокет UDPНа этот раз буфер отправки сокета изображен пунктирными линиями, поскольку он (буфер) на самом деле не существует. У сокета UDP есть размер