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 выполняются в обратном порядке.