Как «приклеить» лямбду внутрь другого лямбда-тела? - PullRequest
0 голосов
/ 04 июня 2018

Скажем, у меня есть две лямбды в Ruby:

lambda1 = -> { puts 'lambda1' }
lambda2 = -> {
  puts 'lambda2 calls lambda1'
  lambda1.()
}

Работает, как и ожидалось:

lambda1.()
# lambda1
lambda2.()
# lambda2 calls lambda1
# lambda1

Но теперь, если я удалю lambda1, lambda2 перестанет работать:

lambda1 = nil
lambda2.()

NoMethodError: неопределенный метод `call 'для nil: NilClass

Что можно сделать, чтобы" приклеить "мой lambda1 к lambda2сделать первое неотъемлемой частью второго и избежать этой ситуации?

1 Ответ

0 голосов
/ 04 июня 2018

Проблема в том, что ваш lambda2 захватывает переменную lambda1 в замыкании, поэтому он замечает, когда lambda1 изменится позже.Решение состоит в том, чтобы просто захватить другую переменную:

lambda1 = -> { puts 'lambda1' }
x = lambda1 # copy the reference
lambda2 = -> { x.() }
lambda1 = nil
lambda2.()

«Но это та же проблема!»Вы можете сказать: «Я могу сломать это, переназначив x!»Ну тогда сделайте так, чтобы x был защищен областью действия:

def wrap x
  -> { x.() }
end

lambda1 = -> { puts 'lambda1' }
lambda2 = wrap lambda1
lambda1 = nil
lambda2.()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...