Ruby — это невероятный язык программирования, в котором есть современные функции и инструменты для большинства сред разработки. У Ruby есть одна мощная функция, о которой часто забывают: блоки .
Суть этой статьи состоит в том, чтобы обсудить и понять, что такое блоки Ruby, как они работают и как мы можем использовать их в наших программах Ruby.
Мы начнем с основного синтаксиса, а затем обсудим такие функции, как yield, которые могут напугать новых пользователей Ruby.
Как и в других языках программирования, блок или закрытие — это анонимная функция, которую вы заключаете в ключевые слова do и end для встроенных блоков.
Блоки позволяют группировать блок кода в отдельные компоненты, которые можно передавать во время вызова метода в качестве параметров.
В Ruby есть два способа определения блока: первый — использовать ключевое слово do..end, второй — использовать пару фигурных скобок.
Блок Do..end в основном используется при определении блока кода, охватывающего несколько строк, а фигурные скобки {} используются при определении блока кода, охватывающего одну строку.
Вы передаете аргументы блока между парой вертикальных черт | |
Ниже приведены два простых примера блока Ruby, в одном из которых используются фигурные скобки, а в другом — do..end.
# single line - {} ['Java', 'C', 'C++'].each { |i| puts i} # multi-line -> do..end ['Java', 'C', 'C++'].each do |i| puts i end
Оба приведенных выше примера дают похожие результаты:
В приведенном выше примере блоки ruby применяются в простейшей форме: мы передаем блок в каждый метод объекта массива. Передайте аргументы блока внутри пары вертикальных черт; в приведенном выше примере аргумент — i. Наконец, мы выводим функциональность блока внутри тела блока (в этом примере — put).
Вы можете использовать блоки Ruby внутри стандартного метода. Функциональность для выполнения этого действия обеспечивается ключевым словом yield.
Давайте подробно обсудим ключевое слово yield.
Ключевое слово yield в Ruby позволяет вызывать определенный блок внутри метода Ruby.
Давайте рассмотрим пример, который поможет нам понять, как работает ключевое слово yield. Рассмотрим простой метод Ruby, показанный ниже:
def hello puts "Привет!" end
Приведенный выше пример представляет собой простой метод Ruby, который выводит «Привет!».
Если мы хотим придать программе большую гибкость, мы можем разрешить пользователю передавать аргумент во время вызова метода.
Следовательно, мы можем закодировать метод как:
def hello(name) puts "Привет, " + name end hello("Russia")
Во втором примере у нас есть небольшая гибкость, поскольку мы можем передать любое имя методу в качестве аргумента.
Мы можем расширить это еще больше, используя блок Ruby. Когда мы передаем блок внутри метода, он будет выполнен и вернет результаты.
Чтобы создать метод, принимающий блок, мы используем ключевое слово yield. Общий синтаксис следующий:
def hello yield end
После определения мы можем вызвать метод и передать блок кода. Метод выполнит код и вернет результат.
Мы можем передать блок в метод, используя синтаксис блока. Например, мы можем вызвать вышеуказанный метод с синтаксисом как:
hello {puts "Hello world" }
Пока метод содержит ключевое слово yield, вы можете передать любой блок кода и выполнить его.
Возьмем другой пример:
def hello puts "before yield." yield puts "after yield." end hello {puts "I yield"}
В приведенном выше примере показано, как работает выполнение метода с использованием yield. Вывод программы ниже:
before yield I am yield after yield
Ruby позволяет передавать аргументы блоку Ruby. Аргументы блока определены в блоке yield и служат параметрами блока.
Порядок, в котором вы передаете аргументы, имеет решающее значение, поскольку блок примет их в установленном порядке.
def hello yield("Andrey Ex", 23) end hello { |name, age| puts "Hello #{name}, you are #{age} years old"}
Параметры, определенные внутри блока, имеют локальную область видимости и доступны только в контексте блока.
Следовательно, вы получите неопределенную переменную, используемую вне области блока.
Функциональность блока не меняется на однолинейных или многострочных блоках. Мы можем проиллюстрировать это на примере ниже:
def area yield(7) end area do puts "площадь круга #{7 * 3.14159}cm2" end
Результат из приведенного выше примера:
Площадь круга 21.99113cm2
Это показывает, что как многострочные, так и однострочные блоки, функциональность остается прежней.
В предыдущих примерах мы определили блоки как неявные. Однако мы также можем описать их как явные.
Явные блоки означают, что мы назначаем имя списку параметров метода.
def example(&block) block.call end example {puts "Explicit block example" }
Вы передаете имя блока внутри после амперсанда. Используя имя блока, вы можете передать сохраненный блок другому методу.
В предыдущих разделах мы упоминали, что блок yield является обязательным. Однако вы можете реализовать простую логику обработки ошибок, если указан yield. Мы делаем это с помощью параметра block_given? Метод ядра.
Метод возвращает логическое значение true, если yield доступен, и false, если в противном случае.
Рассмотрим простой пример ниже:
def hello if block_given? yield else puts "Nothing happened...[ERROR]" end end
Если мы вызовем метод с требуемым значением yield, результат будет:
hello {puts "Hello there!"} Hello there!
С другой стороны, вызов метода без yield выполнит блок else как:
hello Nothing happened...[ERROR]
Используя значение из block_given? , вы можете реализовать логику обработки ошибок, когда нет значения yield.
В этой статье мы обсудили блоки Ruby, что они собой представляют, как они работают и как использовать их в своих проектах.