Вы видели, как Ruby определяет методы, в которые можно поместить число операторов, а затем вы вызываете этот метод. Точно так же в Ruby есть концепция Block.
-
Блок состоит из кусков кода.
-
Вы назначаете имя для блока.
-
Код в блоке всегда заключен в фигурные скобки ({}).
-
Блок всегда вызывается из функции с тем же именем, что и у блока. Это означает, что если у вас есть блок с именем test , то вы используете функциональный тест для вызова этого блока.
-
Вы вызываете блок с помощью оператора yield .
Блок состоит из кусков кода.
Вы назначаете имя для блока.
Код в блоке всегда заключен в фигурные скобки ({}).
Блок всегда вызывается из функции с тем же именем, что и у блока. Это означает, что если у вас есть блок с именем test , то вы используете функциональный тест для вызова этого блока.
Вы вызываете блок с помощью оператора yield .
Синтаксис
block_name { statement1 statement2 .......... }
Здесь вы научитесь вызывать блок с помощью простого оператора yield . Вы также научитесь использовать оператор yield с параметрами для вызова блока. Вы проверите пример кода с обоими типами операторов yield .
Отчет о доходности
Давайте посмотрим на пример выражения yield —
#!/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. Вот пример —
#!/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 из метода, имя которого совпадает с именем блока. Поэтому ты пишешь —
#!/usr/bin/ruby def test yield end test{ puts "Hello world"}
Этот пример — самый простой способ реализовать блок. Вы вызываете тестовый блок с помощью оператора yield .
Но если последнему аргументу метода предшествует &, тогда вы можете передать блок этому методу, и этот блок будет присвоен последнему параметру. Если в списке аргументов есть и *, и &, то & должно появиться позже.
#!/usr/bin/ruby def test(&block) block.call end test { puts "Hello World!"}
Это даст следующий результат —
Hello World!
Начало и конец блоков
Каждый исходный файл Ruby может объявлять блоки кода, которые будут выполняться во время загрузки файла (блоки BEGIN) и после завершения программы (блоки END).
#!/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 выполняются в обратном порядке. При выполнении вышеуказанная программа дает следующий результат —