Мне очень понравилась концепция делегатов. Я действительно не понимаю, почему я не могу просто передать одну функцию другому, и мне нужно передать ее делегату. Я читал в документах, что есть некоторые случаи, когда я не знаю, что это имя, и делегат - это только способ его называть.D: Делегаты или обратные вызовы?
Но теперь у меня возникают проблемы с пониманием концепции обратных вызовов. Я пытался найти больше информации, но я не могу понять, это просто вызов другой функции или что это такое.
Не могли бы вы показать примеры обратных вызовов D и объяснить, где они могут быть полезны?
import vibe.d;
shared static this()
{
auto settings = new HTTPServerSettings;
settings.port = 8080;
listenHTTP(settings, &handleRequest);
}
void handleRequest(HTTPServerRequest req,
HTTPServerResponse res)
{
if (req.path == "/")
res.writeBody("Hello, World!", "text/plain");
}
&handleRequest
это обратный вызов? Как это работает и в какой момент это начинается?
Я бы также добавил: Обычно, когда функция принимает обратный вызов как параметр, тип обратного вызова является 'делегатом', так как он может принимать как обычные функции, так и делегаты. Тривиально преобразовать 'функцию' в' делегат' (как сказано здесь), но преобразование 'делегата' в' функцию' потребует генерации нового кода функции во время выполнения (что вполне осуществимо, но не такого рода хак вы обычно хотели бы иметь дело). – Cauterite
Возможно, вы захотите упомянуть ['toDelegate'] (http://dlang.org/phobos/std_functional.html#toDelegate), чтобы уточнить« вы можете легко превратить указатель на указатель делегата ». Они легко, но не _implicitly_ конвертируемые. – rcorre