Учебники

Рубин — Блоки

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

  • Блок состоит из кусков кода.

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

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

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

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

Блок состоит из кусков кода.

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

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

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

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

Синтаксис

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

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

Отчет о доходности

Давайте посмотрим на пример выражения yield —

Live Demo

#!/usr/bin/ruby

def test
   puts "You are in the method"
   yield
   puts "You are again back to the method"
   yield
end
test {puts "You are in the block"}

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

You are in the method
You are in the block
You are again back to the method
You are in the block

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

Live Demo

#!/usr/bin/ruby

def test
   yield 5
   puts "You are in the method test"
   yield 100
end
test {|i| puts "You are in the block #{i}"}

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

You are in the block 5
You are in the method test
You are in the block 100

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

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

test {|i| puts "You are in the block #{i}"}

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

puts "You are in the block #{i}"

Вывод этого оператора put

You are in the block 5

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

yield a, b

и блок —

test {|a, b| statement}

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

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

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

Live Demo

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

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

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

Live Demo

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

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

Hello World!

Начало и конец блоков

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

Live Demo

#!/usr/bin/ruby

BEGIN { 
   # BEGIN block code 
   puts "BEGIN code block"
} 

END { 
   # END block code 
   puts "END code block"
}
   # MAIN block code 
puts "MAIN code block"

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