Предскажите вывод в консоль для функции с двумя defer-блоками перед return.
Прочитайте функцию ниже. Она регистрирует два defer-блока, затем печатает и возвращает значение, а вызывающий код печатает возвращённое значение.
Считайте, что ничего не бросается и программа компилируется без ошибок.
func load() -> Int {
defer { print("A") }
defer { print("B") }
print("body")
return 42
}
print(load())
Определите точный вывод в консоль построчно и объясните порядок.
defer-блоки выполняются при выходе из области — здесь на return — в порядке LIFO, последний зарегистрированный первым. Печатает body, затем B, затем A; возвращённое 42 — последним, после возврата load(). Вывод — body, B, A, 42.
- ✗Ждут, что
defer-блоки выполнятся в порядке написания (FIFO), а не LIFO - ✗Думают, что
deferсрабатывает на своей строке, а не при выходе из области - ✗Считают, что обычный
returnпропускаетdefer-блоки
- →В каком порядке выполнятся три
defer-блока в одной области? - →Выполнится ли
defer, если функция выходит, бросая ошибку?
The defer blocks are queued as they are reached and drained when the scope exits — at the return — in reverse registration order (LIFO). B was registered after A, so B runs first. load() fully returns 42 before the outer print(load()) can print it, so 42 is last.
func load() -> Int {
defer { print("A") } // registered 1st → runs last
defer { print("B") } // registered 2nd → runs first
print("body")
return 42
}
print(load())
// body
// B
// A
// 42
Output, line by line:
body
B
A
42