Является ли термин "ловушка" (Bash) более точным, чем общий термин "обратный вызов" в программировании?
Пожалуйста примите к сведению:
scripttmp=$(mktemp -d)
cleanup() {
rm -rf "${scripttmp}"
}
trap cleanup EXIT
я понимаю cleanup
является функцией "call(ed)back", так как она вызывается непосредственно перед выходом из главной функции (которую я понимаю как функцию в общем смысле, даже если синтаксис функции отсутствует во всем коде).
Если дело в том, что я никогда не звонил cleanup
раньше, и это первый раз, я не "перезвоню" - я просто перезваниваю перед выходом, но не "обратно".
Это термин trap
точнее, чем общий термин "обратный вызов" в программировании?
1 ответ
"Обратный вызов" происходит от того факта, что вы даете подпрограмме фрагмент кода для последующего выполнения (для случаев, когда выполняется какое-либо условие), а подпрограмма "вызывает обратный вызов", выполняя этот код.
Сравните это с предоставлением кому-то вашего номера телефона, когда он ему нужен. Когда им это нужно, они перезванивают. В этот момент они, возможно, никогда не звонили вам раньше.
В сценарии оболочки trap
используется для установки обратного вызова, который будет оцениваться, когда сигнал "пойман" или "захвачен". Стандартная оболочка также позволяет перехватывать точку при выходе из оболочки (EXIT
) и bash
оболочка дополнительно поддерживает ошибки перехвата (ERR
), выход из функции (RETURN
) и каждая простая команда (DEBUG
).
trap
Утилита не позволяет вызывать функцию обратного вызова для общих асинхронных событий.
В вашем примере cleanup
можно назвать функцию обратного вызова. Устанавливается с trap
и выполнится непосредственно перед выходом из текущей оболочки. Другими словами, trap
Утилита устанавливает EXIT
ловушка, которая будет вызывать функцию обратного вызова cleanup
,
Код установлен trap action event
будет выполнен в порядке, эквивалентном eval action
когда дано event
происходит. action
поэтому может быть любой код оболочки, не обязательно просто вызов функции.
Еще одно слово для вашего cleanup
функция будет "обработчиком", подпрограммой, которая обрабатывает что-то, и, возможно, более конкретно " EXIT
обработчик ". Если бы он использовался для обработки перехваченного сигнала, он был бы" обработчиком сигнала для этого конкретного сигнала ". Также обычно называют эту функцию" обработчиком ловушек " (обработчик, установленный trap
) или просто "ловушка", хотя это не "точнее".
Термин "обратный звонок" никоим образом не подразумевает, что его нужно вызывать снова (это НЕ называется callagain или тому подобное).
Это просто означает, что вызывающий сообщает вызываемому, как уведомить его в каком-то определенном состоянии (так, как ему тогда позвонить) - или какое действие следует предпринять при этом условии (от имени выполнение действия возвращается вызывающему абоненту как вызывающий инициировал это действие, передав его вызываемому объекту в качестве обратного вызова).
Таким образом, формулировка обратного вызова очень четкая и последовательная.
Итак, для примера @Kusalananda есть разные возможности.
Обычно один (или один пакет) обратных вызовов передается вызываемому (подпрограмме, кому-то). Хорошо определено, какой тип информации (-ы) вызываемый абонент будет предоставлять обратному вызову (поэтому передайте ее в качестве аргументов подпрограмме или сообщите ее по телефону получателю вызова). Возможно, это вообще не информация, а просто вызов процедуры или телефонный звонок (так, когда обратный вызов определен без аргументов или необязательных аргументов). Но в любом случае обычно вызывающий имеет некоторое намерение передать обратный вызов вызываемому, поэтому заданная процедура обратного вызова или тот, у кого звонит телефон (это также может быть компьютер, который получает входящий вызов), выполняет то, что инициировал вызывающий, когда он передал этот обратный вызов вызываемому (так что действие возвращается к нему, независимо от того, может ли цель идентифицировать вызывающего или нет).Конечно, обратный вызов может быть определен таким образом, что вызываемый абонент, который вызывает обратный вызов, всегда передает некоторую информацию подпрограмме обратного вызова или тому, кто отвечает на звонок, это может быть некоторая подробная информация о состоянии, некоторая информация, собранная вызов между ними или даже ссылку на исходного вызывающего абонента.
С другой стороны, ловушка - это очень специфическое слово, которое совершенно не похоже на обратный вызов и не взаимозаменяемо. Это означает, что такое официальный перевод / определение словесной ловушки. Ловушка не вызывается вызываемым и не передается вызываемому. Вызываемый может быть пойман. В приведенном выше примере калибровка - это всего лишь оставшаяся процедура после установки ловушки (до момента, когда ловушка будет удалена или деактивирована). Ловушка в некотором роде противоположна обратному вызову, поскольку вызываемый объект (или ловушка, введенная вызываемым пользователем) перехватывает некоторое условие, но извне из контекста возможных вызовов.