Ruby Blocks

Прежде мы рассмотрели, как Ruby определяет методы, в которые можно поместить несколько операторов, а затем вызвать этот метод. Точно так же в Ruby есть концепция Болка:

  • Блок состоит из фрагментов кода.

  • Вы назначаете имя блоку.

  • Код в блоке всегда заключен в фигурные скобки ({}).

  • Блок всегда вызывается из функции с тем же именем, что и у блока. Это означает, что если у вас есть блок с именем test, вы используете функцию test для вызова этого блока.

  • Вы вызываете блок с помощью оператора yield.

Синтаксис:

block_name {

statement1

statement2

..........

}

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

The yield Statement:

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

#!/usr/bin/ruby

​​def test

puts "Вы находитесь в методе"

yield

puts ". Вы снова возвращаетесь к методу"

yield

end

test {put "You are in the block"}

Это даст следующий результат:

Вы в методе

Вы в блоке

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

Вы в блоке

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

#!/usr/bin/ruby

​​def test

yield 5

puts "Вы в тесте метода"

yield 100

end

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

Это даст следующий результат:

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

Вы в тесте метода

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

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

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

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

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

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

Результат этого оператора puts:

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

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

yied a, b

блок:

test {|a, b| statement}

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

Blocks and Methods:

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

def test

yield

end

test { puts "Hello world"}

Этот пример - самый простой способ реализовать блок. Вы вызываете тестовый блок с помощью оператора yield.

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

def test(& block)

block.call

end

test { puts "Hello World!"}

Это даст следующий результат:

Hello World!

Блоки BEGIN и END

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

BEGIN {

begin block code

}

END {

end block code

}

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