DEV Community

Abraão Carvalho
Abraão Carvalho

Posted on

Closures em Ruby

Closures em Ruby são funções anônimas com escopo fechado que mantém o estado do ambiente em que foram criadas, é um conceito fundamental que envolve a capacidade de uma função (ou bloco) para capturar e manter acesso ao ambiente circundante no qual foi criada. Isso significa que a função pode lembrar das variáveis, métodos e contexto em que foi definida, mesmo que seja chamada em um escopo diferente. Closures são poderosas e flexíveis, permitindo criar funções anônimas, implementar callbacks e criar estruturas de controle de fluxo personalizadas.

Vamos entender closures em Ruby com exemplos explicados:

Closure Básica

def create_closure
  x = 10

  #Esta função interna é uma closure
  lambda { |y| puts x + y }
end

closure = create_closure
closure.call(5) #Saída: 15
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, 'create_closure' define uma função interna (um lambda) que captura a variável 'x'. Quando 'create_closure' é chamada, ela retorna essa função interna, que pode ser atribuída a 'closure' e chamada posteriormente, mantendo acesso à variável 'x'.

Closures em Loops

def create_multipliers
  multipliers = []

  1.upto(5) do |i|
    multipliers << lambda { |x| x * i }
  end

  multipliers
end

multiplier_functions = create_multipliers
result = multiplier_functions.map { |fn| fn.call(2) }

#Resultado: [10, 10, 10, 10, 10]
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, criamos uma matriz de funções lambda dentro de um loop. Cada função lambda captura o valor de 'i' do escopo do loop. No entanto, todas as funções usam o último valor de 'i' após a conclusão do loop.

Blocos em Métodos

def execute_block
  puts "Antes do bloco"
  yield
  puts "Depois do bloco"
end

execute_block do
  puts "Dentro do bloco"
end

#Saída:
#Antes do bloco
#Dentro do bloco
#Depois do bloco
Enter fullscreen mode Exit fullscreen mode

Aqui, 'execute_block' é um método que aceita um bloco passado como argumento usando a palavra-chave 'yield'. O bloco pode ser executado dentro do contexto do método e capturar variáveis do ambiente circundante.

Considerações finais

Em resumo, closures em Ruby permitem que funções capturem e mantenham acesso ao ambiente circundante, o que é especialmente útil para criar funções de ordem superior, callbacks e estruturas de controle de fluxo personalizadas. Certifique-se de entender como o escopo funciona em Ruby para evitar surpresas ao usar closures em seu código.

Top comments (0)