Что означает аргумент []() в функции?
Я работаю в библиотеке ESP8266 AsyncWebserver и использую этот [](параметр)
в качестве аргумента для некоторых функций, как показано ниже, но на самом деле не знаю, что это значит. Будучи новичком, мне любопытно узнать, что означает это соглашение, его функциональные возможности и как его использовать. Надеюсь, здешние специалисты помогут мне в этом.
server.on("/page",HTTP_GET,[](AsyncWebServerRequest * request){
some code....;
request->getParam("Param1")->value();
});
@Mr.B, 👍3
1 ответ
Лучший ответ:
▲ 5
Это называется лямбда-выражение и позволяет включить содержимое функции как параметр анонимно вместо того, чтобы писать реальную функцию и использовать ее имя.
Это сокращение от:
void myCallback(AsyncWebServerRequest * request) {
// какой-то код....;
request->getParam("Param1")->value();
}
// ...
server.on("/page", HTTP_GET, myCallback);
У него есть несколько преимуществ по сравнению с традиционными функциями за счет удобочитаемости, например возможность "захватывать" локальные переменные из окружающей области.
,
@Majenko
Смотрите также:
- контент» не захватывается
- Где определить функции обратного вызова веб-сервера, чтобы они могли получить доступ к объекту сервера? (библиотека ESP8266WebServer)
- Несколько клиентских серверов через Wi-Fi
- Передача функции-члена класса в качестве аргумента
- Как получить параметры запроса от ESPAsyncWebServer?
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Как разрешить междоменные запросы на ESP8266 WebServer
Спасибо, Mr.@Majenko, я поищу эту тему дальше. Таким образом, в приведенном выше примере вместо создания новой функции в качестве обратного вызова они использовали лямбда-функцию на ходу для локального использования в самой области действия функции. Я прав. Мне просто любопытно узнать, можем ли мы использовать переменные, объявленные в функции server.on, внутри лямбда-выражения., @Mr.B
Все разъяснено по ссылке. Но любая переменная, определенная внутри функции, в которой появляется
server.on
, может быть "захвачена", поместив ее между[...]
, чтобы затем вы могли использовать ее из самого лямбда-выражения., @MajenkoСпасибо, мистер @Majenko, это полезно, @Mr.B
В более общем смысле, лямбда на самом деле является сокращением для объявления класса где-то в охватывающей его области видимости,
struct unnamed_lambda_helper { /* захваченные локальные переменные являются членами данных этого класса */ auto operator()(/* здесь аргументы */) -> /* здесь возвращаемый тип, если он указан */ { /* здесь тело */ } };
, а затем выражение создает экземпляр этого класса., @HTNWЭто только С++?, @Peter Mortensen
@PeterMortensen Это функция С++ 11 (это означает, что старые компиляторы могут ее не поддерживать). Конечно, в других языках есть своя версия этого. Насколько мне известно, C не поддерживает., @Cort Ammon
Спасибо @CortAmmon, @Mr.B