Ответ 1
Немного сложно увидеть в этом примере, что new Actor
передается в качестве так называемого параметра "по имени". Подумайте об этом, как будто он превращается в функцию типа () => Actor
. Эта функция будет вызываться каждый раз, когда актер будет (повторно) создан его супервизором во время перезагрузки.
Проблема заключается в том, что эта функция является "закрытием" (очень просто для Google;)), что означает, что она захватывает и запоминает все в окружающем пространстве, которое ему нужно (иногда, но очень редко называемое "копирование стека" )). Например, val f = (a: Int) => a + x
. Откуда берется x
? Он исходит из окружающей сферы. Функция litetal, назначенная f
, называется "открытым термином". Во время выполнения функция literal становится значением функции (это фантастический способ сказать "объект" ), который при выполнении закрывает открытый термин, захватывая все в окружающей области. То, откуда происходит название "закрытие".
Закрытие очень полезно, но вы должны быть осторожны, что вы закрываете. Иногда x
является def
или богом запрещает a var
, что приводит к непредсказуемым результатам для f
, потому что у вас нет контроля над временем, когда f
будет вызываться/выполняться. Попробуйте!
Два очень распространенных антипатерна в Акке:
- Закрытие (внешний)
this
справки при создании Актера из внутреннего класса. - Закрытие
def sender
при ответе на сообщение с будущим.
Я дал вам кучу причудливых терминов для Google специально, btw;)
Приветствия и счастливое кодирование