Ruby - Blocos

Você viu como Ruby define métodos onde você pode colocar um número de instruções e então chamar esse método. Da mesma forma, Ruby tem um conceito de Bloco.

  • Um bloco consiste em pedaços de código.

  • Você atribui um nome a um bloco.

  • O código no bloco está sempre entre colchetes ({}).

  • Um bloco é sempre invocado a partir de uma função com o mesmo nome do bloco. Isso significa que, se você tiver um bloco com o nome teste , use o teste de função para invocar esse bloco.

  • Você invoca um bloco usando a instrução de rendimento .

Sintaxe

block_name {
   statement1
   statement2
   ..........
}

Aqui, você aprenderá a invocar um bloco usando uma instrução de rendimento simples . Você também aprenderá a usar uma instrução de rendimento com parâmetros para invocar um bloco. Você verificará o código de amostra com os dois tipos de declarações de rendimento .

A declaração de rendimento

Vejamos um exemplo da declaração de rendimento -

#!/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"}

Isso produzirá o seguinte resultado -

You are in the method
You are in the block
You are again back to the method
You are in the block

Você também pode passar parâmetros com a declaração de rendimento. Aqui está um exemplo -

#!/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}"}

Isso produzirá o seguinte resultado -

You are in the block 5
You are in the method test
You are in the block 100

Aqui, a declaração de rendimento é escrita seguida por parâmetros. Você pode até passar mais de um parâmetro. No bloco, você coloca uma variável entre duas linhas verticais (||) para aceitar os parâmetros. Portanto, no código anterior, a instrução yield 5 passa o valor 5 como um parâmetro para o bloco de teste.

Agora, olhe para a seguinte declaração -

test {|i| puts "You are in the block #{i}"}

Aqui, o valor 5 é recebido na variável i . Agora, observe a seguinte instrução puts -

puts "You are in the block #{i}"

A saída desta instrução puts é -

You are in the block 5

Se você deseja passar mais de um parâmetro, a declaração de rendimento se torna -

yield a, b

e o bloco é -

test {|a, b| statement}

Os parâmetros serão separados por vírgulas.

Blocos e Métodos

Você viu como um bloco e um método podem ser associados um ao outro. Normalmente, você invoca um bloco usando a instrução yield de um método que tem o mesmo nome do bloco. Portanto, você escreve -

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

Este exemplo é a maneira mais simples de implementar um bloco. Você chama o bloco de teste usando a declaração de rendimento .

Mas se o último argumento de um método for precedido por &, então você pode passar um bloco para este método e este bloco será atribuído ao último parâmetro. No caso de * e & estarem presentes na lista de argumentos, & deve vir depois.

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

Isso produzirá o seguinte resultado -

Hello World!

Blocos BEGIN e END

Cada arquivo fonte Ruby pode declarar blocos de código a serem executados enquanto o arquivo está sendo carregado (os blocos BEGIN) e após o programa terminar de ser executado (os blocos 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"

Um programa pode incluir vários blocos BEGIN e END. Os blocos BEGIN são executados na ordem em que são encontrados. Os blocos END são executados na ordem inversa. Quando executado, o programa acima produz o seguinte resultado -

BEGIN code block
MAIN code block
END code block