English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Вы уже знаете, как Ruby определяет методы и как вы вызовите метод. Аналогично, Ruby имеет концепцию блока.
block_name{ statement1 statement2 .......... }
здесь вы узнаете, как использовать простой yield выражение для вызова блока. Вы также узнаете, как использовать выражения с аргументами yield выражение для вызова блока. В примере вы увидите这两种 типа yield выражение.
Давайте посмотрим на пример выражения yield:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- def test puts "Вы находитесь в методе test" yield puts "Вы вернулись в метод test" yield end test {puts "Вы находитесь в блоке"}
Результат выполнения примеров выше:
в методе test Вы находитесь в блоке Вы вернулись в метод test Вы находитесь в блоке
Вы также можете передавать выражения yield с аргументами. Вот пример:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- def test yield 5 puts "Вы находитесь в методе test" yield 100 end test {|i| puts "Вы находитесь в блоке #{i}"}
Результат выполнения примеров выше:
Вы находитесь в блоке 5 в методе test Вы находитесь в блоке 100
здесьyield выражение следует за аргументами. Вы можете передавать несколько аргументов. В блоке вы можете поместить переменную между двумя竖ыми для приема аргументов. Таким образом, в приведенном выше коде выражение yield 5 передает значение 5 в блок test в качестве аргумента.
Теперь, посмотрите на следующее выражение:
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 "Hello world"}
Этот пример является наиболее простым способом реализации блока. Вы используете yield вызов выражения test блока.
Если перед последним аргументом метода стоит &, то вы можете передать методу блок, который можно присвоить последнему аргументу. Если в списке аргументов вместе с * и & встречается &, то & должен стоять в конце.
#!/usr/bin/ruby def test(&block) block.call end test { puts "Hello World!"}
Результат выполнения примеров выше:
Привет мир!
Каждый файл на Ruby может объявлять блок кода, который выполняется при загрузке файла (блок BEGIN), а также блок кода, который выполняется после завершения выполнения программы (блок END).
#!/usr/bin/ruby BEGIN { # Начало блока кода puts "Начало блока кода" } END { # Конец блока кода puts "Конец блока кода" } # Основной блок кода puts "Основной блок кода"
Программа может содержать несколько блоков BEGIN и END. Блоки BEGIN выполняются в порядке их появления. Блоки END выполняются в порядке, обратном их的出现. При выполнении上面的 программы выводится следующее:
Начало блока кода Основной блок кода Конец блока кода