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

def generate

  first = yield 1   # This will be 2

  second = yield 2  # This will be 10

  third = yield 3   # This will be 4

  first + second + third

end

result = generate do |x|

  if x == 2

     next 10

  end

  x + 1

end

p result

Метод generate вызывает полученный блок три раза, а затем вычисляет сумму результатов. Наконец, этот метод вызывается, передавая блок, который может завершиться раньше при следующем вызове. Хорошей аналогией является то, что если бы блоки были методами, ключевое слово yield действовало бы как вызов метода, а next было бы эквивалентно return.

Другой способ выйти из выполнения блока — использовать ключевое слово break.

<p>Использование <code>break</code> внутри блока</p>

Используйте break, чтобы остановить метод, вызывающий блок, действуя так, как если бы он вернулся. Расширяя тот же пример, что и раньше, посмотрите на следующее:

result = generate do |x|

   if x == 2

     break 10 # break instead of next

   end

x + 1

end

p result

В этом случае yield 1 будет равна 2, но yield 2 никогда не вернется; вместо этого метод generate будет сразу завершен, а result получит значение 10. Ключевое слово break приводит к завершению метода, вызывающего блок.

<p>Возвращение изнутри блока</p>

Наконец, давайте посмотрим, как ведет себя return при использовании внутри блока. Гипотеза Коллатца — это интересная математическая задача, которая предсказывает, что последовательность, в которой следующее значение вдвое превышает предыдущее, если оно четное, или в три раза больше плюс один, если оно нечетное, в конечном итоге всегда достигнет 1, независимо от того, какое начальное число выбрано.

Следующий метод collatz_sequence реализует эту последовательность, бесконечно вызывая блок для каждого элемента. Эта реализация не имеет условия остановки и может либо работать вечно, либо быть завершена раньше вызывающей стороной.

Затем следует реализация метода, который запускает collatz_sequence с некоторым начальным значением и подсчитывает, сколько шагов необходимо, чтобы достичь 1:

def collatz_sequence(n)

   while true

      n = if n.even?

      n // 2

   else

      3 * n + 1

   end

   yield n

   end

end

def sequence_length(initial)

   length = 0

   collatz_sequence(initial) do |x|

      puts "Element: #{x}"

      length += 1

      if x == 1

         return length # <= Note this 'return'

      end

  end

end

puts "Length starting from 14 is: #{sequence_length(14)}"

Метод sequence_length отслеживает количество шагов и, как только оно достигает 1, выполняет возврат. В этом случае обратите внимание, что возврат происходит внутри блока метода collatz_sequence. Ключевое слово return останавливает вызов блока (например, next), останавливает метод, который вызвал блок с yield (например, break), но затем также останавливает метод, в котором записывается блок. Напоминаем, что return всегда завершает выполнение определения, которое находится внутри.

В этом примере кода выводится Length starting from 14 is: 17. Фактически, гипотеза Коллатца утверждает, что этот код всегда найдет решение для любого положительного целого числа. Однако это нерешенная математическая проблема.

<p>Контейнеры данных</p>

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

Array (Массив) — линейный и изменяемый список элементов. Все значения будут иметь один тип, возможно, объединение.

Tuple (Кортеж) — линейный и неизменяемый список элементов, в котором точный тип каждого элемента сохраняется и известен во время компиляции.

Set (Набор) — уникальная и неупорядоченная группа элементов. Значения никогда не повторяются, и при перечислении значения отображаются в том порядке, в котором они были вставлены (без дубликатов).

Hash (Хэш) — уникальная коллекция пар ключ-значение. Значения можно получить по их ключам и перезаписать, обеспечивая уникальность ключей. Как и Set, он нумеруется в порядке вставки.

NamedTuple — неизменяемая коллекция пар ключ-значение, где каждый ключ известен во время компиляции, а также тип каждого значения.

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

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

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

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

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

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

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

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

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