Вы видели, как Ruby определяет методы, в которых вы можете поместить несколько операторов, а затем вы вызываете этот метод. Аналогично, Ruby имеет концепцию Block.
block_name { statement1 statement2 .......... }
Здесь вы научитесь вызывать блок, используя простой оператор yield. Вы также научитесь использовать оператор yield с параметрами для вызова блока. Вы проверите образец кода с двумя типами операторов yield.
Давайте посмотрим на пример оператора yield:
#!/usr/bin/ruby def test puts "Вы находитесь в методе" yield puts "Вы снова вернулись к методу" yield end test {puts "Вы находитесь в блоке"}
Это приведет к следующему результату:
Вы находитесь в методе Вы находитесь в блоке Вы снова вернулись к методу Вы находитесь в блоке
Вы также можете передавать параметры с помощью инструкции yield. Вот пример:
#!/usr/bin/ruby def test yield 5 puts "Вы находитесь в методе test" yield 100 end test {|i| puts "Вы находитесь в блоке #{i}"}
Это приведет к следующему результату:
Вы находитесь в блоке 5 Вы находитесь в методе test Вы находитесь в блоке 100
Здесь оператор yield записывается с последующими параметрами. Вы даже можете передать несколько параметров. В блоке вы переносите переменную между двумя вертикальными линиями (||), чтобы принять параметры. Поэтому в предыдущем коде оператор 5 выводит значение 5 в качестве параметра тестового блока.
Теперь рассмотрим следующее утверждение:
test {|i| puts "Вы находитесь в блоке #{i}"}
Здесь значение 5 принимается в переменной i . Теперь обратите внимание на следующий оператор puts:
puts "Вы находитесь в блоке #{i}"
Результатом этого оператора puts является:
Вы находитесь в блоке 5
Если вы хотите передать несколько параметров, то инструкция yield указывается так:
yield a, b
и блок:
test {|a, b| statement}
Параметры будут разделены запятыми.
Вы видели, как блок и метод могут быть связаны друг с другом. Обычно вы вызываете блок, используя оператор yield из метода, который имеет то же имя, что и у блока. Поэтому вы пишете:
#!/usr/bin/ruby def test yield end test {puts "Привет мир"}
Этот пример является самым простым способом реализации блока. Вы вызываете тестовый блок, используя оператор yield.
Но если последнему аргументу метода предшествует &, то вы можете передать блок этому методу, и этот блок будет назначен последнему параметру. В случае, если и * и & присутствуют в списке аргументов, & должны появиться позже.
#!/usr/bin/ruby def test(&block) block.call end test{puts "Привет мир!"}
Это приведет к следующему результату:
Привет мир!
Каждый исходный файл Ruby может объявлять блоки кода, которые будут выполняться при загрузке файла (блоки BEGIN) и после завершения программы (блоки END).
#!/usr/bin/ruby BEGIN { # блок кода BEGIN puts "блок кода BEGIN" } END { # блок кода END puts "блок кода END" } # блок кода MAIN puts "блок кода MAIN"
Программа может включать несколько блоков BEGIN и END. Блоки BEGIN выполняются в том порядке, в котором они встречаются. Блоки END выполняются в обратном порядке. При выполнении вышеуказанной программы получается следующий результат:
блок кода BEGIN блок кода MAIN блок кода END
тит