Метапрограммирование в Ruby: разбор примера::Журнал СА 12.2014
www.samag.ru
Журнал «БИТ. Бизнес&Информационные технологии»      
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Мобильные приложения  

Искусственный интеллект в мобильных приложениях: возможности и перспективы

Обзор современных применений ИИ в мобильных приложениях, анализ перспектив развития этой технологии,

 Читать далее...

ИТ-образование  

Как сделать ИТ-образование эффективным?

Эксперты ИТ-отрасли отвечают на вопросы «СА». Обсуждаем ключевые аспекты для улучшения образовательных

 Читать далее...

Work-life balance  

Как айтишнику найти баланс между работой и личной жизнью?

Обсуждаем инструменты для эффективного управления временем, снижения уровня стресса и достижения гармонии. На

 Читать далее...

Книжная полка  

Всё самое нужное – под одной обложкой

Отличительная черта книжных новинок, выпущенных недавно издательством «БХВ» – это их универсальность. Не просто

 Читать далее...

ИТ-инфраструктура  

Системы мониторинга ИТ-инфраструктуры-2025

Без мониторинга ИТ-инфраструктуры не обходится ни одна компания, хотя бы потому, что

 Читать далее...

Открытое ПО  

Безопасность Open Source: рискуем или контролируем?

Компания «Кросс технолоджис» изучила, как используется ПО с открытым кодом в компаниях

 Читать далее...

Работа с нейросетью  

Скажи, есть ли у тебя AI, и я скажу, кто ты

Недавно сервис по поиску работы SuperJob выяснил, что каждый второй россиянин уже

 Читать далее...

Работа с Debian  

О Linux с любовью или Debian: через знание к любви

Конечно, одним лишь перечислением замечательных качеств любовь к Linux не возникнет. Для

 Читать далее...

Опрос  

Защита личных и клиентских данных: как мошенники используют ИИ и как защититься?

По данным RED Security, общее число кибератак на российские компании в 2024

 Читать далее...

Опрос  

Облачные инструменты для разработчиков

Эксперты ИТ-отрасли отвечают на вопросы «Системного администратора» > Как с помощью облака сделать

 Читать далее...

Опрос  

Рынок мобильных приложений: что будет актуальным в 2025 году?

Эксперты ИТ-отрасли отвечают на вопросы «Системного администратора» > Ваши прогнозы: чего ожидать от

 Читать далее...

Рынок труда  

Как успешно пройти все этапы собеседования на ИТ-должность?

По оценкам государства, дефицит ИТ-специалистов составляет от 740 тысяч до 1 миллиона

 Читать далее...

Спецпроект «Базальт СПО». Развитие Open Source в России  

Алексей Смирнов: «Сейчас трудно найти программный продукт, в котором нет свободного кода»

Какое будущее ждет свободное ПО? Влияет ли свободная или несвободная разработка на

 Читать далее...

Спецпроект «Базальт СПО». Развитие Open Source в России  

Николай Костригин: «Мы создали Hantis, конвейер автоматизации. Проекты, исследуемые разными инструментами, переходят от одного исполнителя к другому, развиваются, возвращаются к автору, и так по кругу»

О том, как идет работа по повышению безопасности отечественного программного обеспечения, рассказывает

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 7802
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 8070
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 5425
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3443
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 4242
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 4243
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6774
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3595
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3864
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7757
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 11111
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12840
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 14613
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9546
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7515
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5793
Комментарии: 4
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4991
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3846
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3524
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3758
Комментарии: 1
Рецензия на книгу «MongoDB в действии»

 Читать далее...

Друзья сайта  

 Метапрограммирование в Ruby: разбор примера

Архив номеров / 2014 / Выпуск №12 (145) / Метапрограммирование в Ruby: разбор примера

Рубрика: Разработка /  Особенности языка

Иван Шихалев ИВАН ШИХАЛЕВ, фрилансер, специализируется на веб-разработке и Ruby, shikhalev@gmail.com

Метапрограммирование в Ruby:
разбор примера

Добавление собственных абстракций в объектную модель – это просто. И интересно. От частных примеров – к общим принципам программирования в Ruby

Авторы книги «Programming Ruby: The Pragmatic Program-mers' Guide» называют метапрограммированием расширение и изменение абстракций языка (тогда как собственно программирование пользуется теми, что есть). Конечно, можно поспорить о том, что считать такой абстракцией, а что нет, однако нельзя не заметить, что в современных динамических языках, таких как Ruby или, например, Python, легко делаются некоторые вещи, находившиеся в классических языках именно на языковом уровне и жестко определявшиеся компилятором. Тут можно вспомнить для примера декораторы, о которых я писал в сентябре прошлого года [1]. И сейчас мы рассмотрим нечто подобное. В процессе я буду делать обобщающие отступления, переходя от частного примера к общим принципам программирования в Ruby.

Формулировка задачи

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

Представим, что мы пишем графический редактор, а лучше 3D-конструктор (мебели, например). Нам придется оперировать множеством разнородных (разные классы) объектов, обладающих различными характеристиками, часть которых уместно сделать изменяемыми в процессе редактирования. Характеристики, в общем-то, задаются в разных местах – что-то подгружается из файлов, что-то задается пользователем через поля ввода, что-то меняется посредством мыши и т.д. И, сделав уже половину работы, мы обнаруживаем при тестировании, что отрисовка время от времени выбрасывает ошибку из-за некорректно заданных характеристик – длина доски вдруг оказалась равна строке «стеариновая свечка»...

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

Ни контроля значений, ни событий при присваивании стандартные атрибуты в Ruby не поддерживают. Конечно, можно вручную определить методы-сеттеры, но лучше все-таки однотипный код вынести в одно определение, которое затем и использовать с различными аргументами. Поскольку термин «свойство» в Ruby не занят, так эти новые конструкции и назовем.

Наши свойства будут поддерживать:

  • контроль присваиваемых значений;
  • значения по умолчанию;
  • события, вызываемые при установке значения.

Определение свойств будет выглядеть примерно так:

property :alpha, filter: String, default: ''

property :beta, :gamma, filter: Integer, default: 0

property :delta, filter: Float,

default: 1.0 do |obj, prop, value|

p [obj, prop, value]

end

Последний вариант задает обработчик события. В случае, когда никаких именованных параметров, даже filter, не задано, property будет работать, в сущности, аналогично стандартному attr_accessor. Заметим, что атрибуты в Ruby определяются не ключевыми словами, а приватными методами класса Module. Логично будет пойти тем же путем.

Замечание: ключевые слова «module» и «class» в Ruby не формируют какое-то сакральное определение, принципиально отличающееся от остальной части программы, а просто переводят исполнение в контекст модуля (или класса соответственно), по необходимости создавая его. Это значит, что внутри определений мы можем писать, в общем-то, произвольный код, учитывая контекст, конечно [2]. При этом благодаря необязательности скобок при вызове такие методы, как attr, include, private, module_function, выглядят структурными элементами языка.

Статью целиком читайте в журнале «Системный администратор», №12 за 2014 г. на страницах 56-59.

PDF-версию данного номера можно приобрести в нашем магазине.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru