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

Два других метода, #args и #named_args, не возвращают конкретное значение, а вместо этого возвращают коллекцию всех позиционных или именованных аргументов в аннотации в виде TupleLiteral и NamedTupleLiteral соответственно.

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

annotation MyClass; end

Annotation MyAnnotation; end

@[MyClass(true, id: "foo_class")]

class Foo

  {% begin %}

    {% ann = @type.annotation MyClass %}

    {% pp "#{@type} has positional arguments of:

      #{ann.args}" %}

    {% pp "and named arguments of #{ann.named_args}" %}

    {% pp %(and is #{ann[0] ? "active".id :

      "not active".id}) %}

    {% status = if my_ann = @type.annotation MyAnnotation

                  "DOES"

                else

                  "DOES NOT"

                end %}

    {% pp "#{@type} #{status.id} have MyAnnotation applied." %}

  {% end %}

end

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

"Foo has positional arguments of: {true}"

"and named arguments of {id: \"foo_class\"}"

"and is active."

"Foo DOES NOT have MyAnnotation applied."

Мы также можем сделать то же самое с аннотацией, примененной к методу:

annotation MyMethod; end

@[MyMethod(4, 1, 2, id: "foo")]

def my_method

  {% begin %}

    {% ann = @def.annotation MyMethod %}

    {% puts "\n" %}

    {% pp "Method #{@def.name} has an id of #{ann[:id]}" %}

    {% pp "and has #{ann.args.size} positional arguments" %}

    {% total = ann.args.reduce(0) { |acc, v| acc + v } %}

    {% pp "that sum to #{total}" %}

  {% end %}

end

my_method

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

"Method my_method has an id of \"foo\""

"and has 3 positional arguments"

"that sum to 7"

В обоих этих примерах мы использовали все три метода, а также некоторые сами типы коллекций. Мы также увидели, как обрабатывать необязательную аннотацию, следуя той же логике обработки nil, что и в коде Crystal, не являющемся макросом. Если бы к нашему классу была применена аннотация, мы могли бы получить доступ к любым дополнительным данным из него через переменную my_ann, так же, как мы это делали с переменной ann в предыдущих строках. Этот шаблон может быть невероятно полезен, позволяя влиять на логику макроса наличием или отсутствием аннотации. Это может привести к более читабельному коду, для которого в противном случае потребовалась бы одна аннотация со множеством различных полей.

Как и в предыдущем примере с несколькими аннотациями для одного элемента, метод #annotation возвращает последнюю аннотацию, примененную к данному элементу. Если вы хотите получить доступ ко всем примененным аннотациям, вместо этого вам следует использовать метод #annotations. Этот метод работает почти идентично другому методу, но возвращает ArrayLiteral(Annotation) вместо Annotation?. Например, мы могли бы использовать этот метод для перебора нескольких аннотаций, чтобы напечатать индекс аннотации вместе со значением, которое она хранит:

annotation MyAnnotation; end

@[MyAnnotation("foo")]

@[MyAnnotation(123)]

@[MyAnnotation(123)]

def annotation_read

  {% for ann, idx in @def.annotations(MyAnnotation) %}

    {% pp "Annotation #{idx} = #{ann[0].id}" %}

  {% end %}

end

annotation_read

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

"Annotation 0 = foo"

"Annotation 1 = 123"

"Annotation 2 = 123"

Вот и все. Аннотации сами по себе являются довольно простой функцией, но могут быть весьма мощными в сочетании с некоторыми другими функциями метапрограммирования Crystal.

<p>Резюме</p>
Перейти на страницу:

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

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

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

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

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

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

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

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