Що таке замикання (closures) в Ruby?

В Ruby замикання або closures є концепцією, яка дозволяє функції зберігати доступ до змінних з оточення, в якому вони були визначені, навіть після того, як вони вийшли з цього оточення. Замикання є способом зберігання стану та контексту виклику функції.

Основна ідея замикань в Ruby полягає в тому, що ви можете визначити функцію всередині іншої функції, і внутрішня функція може мати доступ до змінних, що визначені в зовнішній функції.

def outer_function(x)
  # Внутрішня функція, яка є замиканням
  inner_function = proc do |y|
    puts x + y
  end

  # Повертаємо замикання з outer_function
  return inner_function
end

# Створюємо замикання, передаючи йому значення x
closure = outer_function(10)

# Викликаємо замикання з новим значенням y
closure.call(5)  # Результат буде 15

У цьому прикладі inner_function - це замикання, яке має доступ до параметра x, визначеного в outer_function. Коли ми викликаємо outer_function(10), ми отримуємо замикання, яке може використовувати значення x після того, як outer_function вже вийшла з виклику.

Замикання в Ruby часто використовуються для створення анонімних функцій або для передачі функцій як аргументів до інших функцій.