Ruby: с нуля – часть 9: блоки

 

ruby_logoПредыдущая часть – часть 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

Программа может включать в себя любое количество таких блоков, которые будут выполнятся в порядке их описания в коде.