Читаем Crystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI полностью

Макрос property также обрабатывает несколько дополнительных случаев использования, но сейчас давайте сосредоточимся на наиболее распространенном. Наша реализация этого макроса будет выглядеть так:

macro def_getter_setter(decl)

  @{{decl}}

  def {{decl.var}} : {{decl.type}}

    @{{decl.var}}

  end

  def {{decl.var}}=(@{{decl.var}} : {{decl.type}})

  end

end

Мы можем определить переменную экземпляра, используя @{{decl}}, потому что она автоматически расширится до нужного формата. Мы могли бы также использовать @{{decl.var}} : {{decl. type}}, но другой путь был короче и лучше обрабатывал значения по умолчанию. Более длинная форма должна будет явно проверить и установить значение по умолчанию, если таковое имеется, тогда как более короткая форма сделает это за нас. Однако тот факт, что вы можете реконструировать узел вручную, используя предоставляемые им методы, не является совпадением. Узлы AST — это абстрактные представления чего-либо внутри программы, например, объявление типа, метода или выражение оператора if, поэтому имеет смысл только то, что вы можете построить то, что представляет узел, используя сам узел.

Остальная часть нашего макроса def_getter_setter строит методы получения и установки для определенной переменной экземпляра. Отсюда мы можем пойти дальше и использовать его:

class Foo

  def_getter_setter name : String?

  def getter setter number : Int32 = 123

  property float : Float64 = 3.14

end

obj = Foo.new

pp obj.name

obj.name = "Bob"

pp obj.name

pp obj.number

pp obj.float

Запуск этой программы приведет к следующему выводу:

nil

"Bob"

123

3.14

И вот оно! Успешная повторная реализация наиболее распространенной формы макроса property! Здесь легко увидеть, как можно использовать макросы, чтобы уменьшить количество шаблонов и повторений в вашем приложении.

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

<p>Изучение макро-хуков</p>

Перехватчики макросов — это специальные определения макросов, которые в некоторых ситуациях вызываются компилятором Crystal во время компиляции. К ним относятся следующие:

 inherited вызывается, когда определен подкласс, где @type — это наследующий тип.

 included вызывается при включении модуля, где @type — включаемый тип.

 extended вызывается при расширении модуля, где @type — расширяемый тип.

• method_missing вызывается, когда метод не найден, и ему передается один аргумент Call.

• method_added вызывается, когда новый метод определен в текущей области и ему передается один аргумент Def.

 finished вызывается после этапа семантического анализа, поэтому известны все типы и их методы.

Первые три и законченные определения являются наиболее распространенными/полезными, поэтому мы сосредоточимся на них. Первые три хука работают по сути одинаково — они просто выполняются в разных контекстах. Например, следующая программа демонстрирует, как они работают, определяя различные перехватчики и печатая уникальное сообщение при выполнении этого перехватчика:

abstract class Parent

  macro inherited

    puts "#{{{@type.name}}} inherited Parent"

  end

end

module MyModule

  macro included

    puts "#{{{@type.name}}} included MyModule"

  end

  macro extended

    puts "#{{{@type.name}}} extended MyModule"

  end

end

class Child < Parent

  include MyModule

  extend MyModule

end

Предыдущий код выведет следующий результат:

Child inherited Parent

Child included MyModule

Child extended MyModule

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

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных