Предыдущая часть — часть 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
Программа может включать в себя любое количество таких блоков, которые будут выполнятся в порядке их описания в коде.





4 990 views