Поиск по сайту:
Не всякому человеку даже гусарский мундир к лицу (К. Прутков).

Ruby — Блоки

[wtr-time]
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
13.07.2018
Язык программирования Ruby

Вы видели, как Ruby определяет методы, в которых вы можете поместить несколько операторов, а затем вы вызываете этот метод. Аналогично, Ruby имеет концепцию Block.

  • Блок состоит из кусков кода.
  • Вы назначаете имя блоку.
  • Код в блоке всегда заключен в фигурные скобки ({}).
  • Блок всегда вызывается из функции с тем же именем, что и блок. Это означает, что если у вас есть блок с тестом имен, то вы используете функцию test для вызова этого блока.
  • Вы вызываете блок с помощью оператора yield.

Синтаксис

block_name {
   statement1
   statement2
   ..........
}

 

Здесь вы научитесь вызывать блок, используя простой оператор yield. Вы также научитесь использовать оператор yield с параметрами для вызова блока. Вы проверите образец кода с двумя типами операторов yield.

Заявление yield

Давайте посмотрим на пример оператора yield:

#!/usr/bin/ruby

def test
   puts "Вы находитесь в методе"
   yield
   puts "Вы снова вернулись к методу"
   yield
end
test {puts "Вы находитесь в блоке"}

 

Это приведет к следующему результату:

Вы находитесь в методе
Вы находитесь в блоке
Вы снова вернулись к методу
Вы находитесь в блоке

 

Вы также можете передавать параметры с помощью инструкции yield. Вот пример:

#!/usr/bin/ruby

def test
   yield 5
   puts "Вы находитесь в методе test"
   yield 100
end
test {|i| puts "Вы находитесь в блоке #{i}"}

 

Это приведет к следующему результату:

Вы находитесь в блоке 5
Вы находитесь в методе test
Вы находитесь в блоке 100

 

Здесь оператор yield записывается с последующими параметрами. Вы даже можете передать несколько параметров. В блоке вы переносите переменную между двумя вертикальными линиями (||), чтобы принять параметры. Поэтому в предыдущем коде оператор 5 выводит значение 5 в качестве параметра тестового блока.

Теперь рассмотрим следующее утверждение:

test {|i| puts "Вы находитесь в блоке #{i}"}

 

Здесь значение 5 принимается в переменной i . Теперь обратите внимание на следующий оператор puts:

puts "Вы находитесь в блоке #{i}"

 

Результатом этого оператора puts является:

Вы находитесь в блоке 5

 

Если вы хотите передать несколько параметров, то инструкция yield указывается так:

yield a, b

 

и блок:

test {|a, b| statement}

 

Параметры будут разделены запятыми.

Блоки и методы

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

#!/usr/bin/ruby

def test
   yield
end
test {puts "Привет мир"}

 

Этот пример является самым простым способом реализации блока. Вы вызываете тестовый блок, используя оператор yield.

Но если последнему аргументу метода предшествует &, то вы можете передать блок этому методу, и этот блок будет назначен последнему параметру. В случае, если и * и & присутствуют в списке аргументов, & должны появиться позже.

#!/usr/bin/ruby

def test(&block)
   block.call
end
test{puts "Привет мир!"}

 

Это приведет к следующему результату:

Привет мир!

Блоки BEGIN и END

Каждый исходный файл Ruby может объявлять блоки кода, которые будут выполняться при загрузке файла (блоки BEGIN) и после завершения программы (блоки END).

#!/usr/bin/ruby

BEGIN { 
   # блок кода BEGIN 
   puts "блок кода BEGIN"
} 

END { 
   # блок кода END
   puts "блок кода END"
}
   # блок кода MAIN
puts "блок кода MAIN"

 

Программа может включать несколько блоков BEGIN и END. Блоки BEGIN выполняются в том порядке, в котором они встречаются. Блоки END выполняются в обратном порядке. При выполнении вышеуказанной программы получается следующий результат:

блок кода BEGIN
блок кода MAIN
блок кода END

тит

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Спасибо!

Теперь редакторы в курсе.