Предыдущая часть — часть 8: методы.
Кроме методов, котоыре позволяют группировать несколько выражений — Ruby поддерживает концепцию «блоков»:
- блок содержит часть кода;
- блоку присваивается имя;
- код в блоке всегда заключается между парой фигурных скобок
{}
; - блок всегда вызывается из функции с тем же именем;
- вызов блока выполняется с помощью оператора
yeild
.
Ситаксис:
block_name { statement1 statement2 .......... }
Содержание
Оператор 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"}
Результат его выполнения:
$ ./yiled.rb 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}"}
Результат:
$ ./yiled.rb You are in the block 5 You are in the method test You are in the block 100
Тут после yield
описывается его параметр, а в блоке между двумя ||
определяется переменная, которая принимает этот параметр. В результате — yield 5
передает значение 5 переменной #{i}
блока test {}
.
Ананлогично можно передавать и несколько параметров:
#!/usr/bin/ruby def test yield 5, 10 puts "You are in the method test" yield 100, 200 end test {|a, b| puts "You are in the block #{a} #{b}"}
Результат:
$ ./yiled.rb You are in the block 5 10 You are in the method test You are in the block 100 200
Блоки и методы
Вы уже видели как методы связываются с блоками — в методе вы вызываете блок с помощью оператора yield
:
#!/usr/bin/ruby def test yield end test{ puts "Hello world"}
Результат:
$ ./yiled.rb Hello world
Это самый простой способ вызова блока.
Вы так же можете использовать аперсанд «&"
, что бы передать весь блок методу. При использовании и «*"
и «&"
— «&"
должен быть указан последним в списке параметров метода.
Пример:
#!/usr/bin/ruby def test(&block) block.call end test { puts "Hello World!"}
Результат:
$ ./yiled.rb Hello World!
Блоки BEGIN
и END
В любом файле 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"
Результат:
$ ./block_end.rb BEGIN code block MAIN code block END code block
Программа может включать в себя любое количество таких блоков, которые будут выполнятся в порядке их описания в коде.