Ext JS 3.4. обратные вызовы

Я знаю, что это старый вопрос, однако я думал, что поделился своим опытом использования Lambda capture

#include <iostream>
#include <memory>

using std::unique_ptr;
using std::make_unique;
using std::cout;
using std::endl;

class foo {
public:
    foo(int no) : no_(no) {

    }

    template <typename Lambda>
    void lambda_func(Lambda&& l) {
        cout << "No is " << no_ << endl;
        l();
    }

private:
    int no_;
};

int main() {
    auto f = std::make_unique<foo>(10);

    f->lambda_func([f = std::move(f)] () mutable {
        cout << "lambda ==> " << endl;
        cout << "lambda <== " << endl;
    });

    return 0;
}

. Этот сегмент кода неисправен

$ g++ -std=c++14  uniqueptr.cpp  
$ ./a.out 
Segmentation fault (core dumped)

Если I удалите инструкцию std::cout из lambda_func. Код запускается до завершения.

Кажется, что этот оператор f->lambda_func([f = std::move(f)] () mutable { обрабатывает лямбда-захваты перед вызовом функции-члена.

1
задан Norgul 1 March 2019 в 07:28
поделиться

1 ответ

Я бы передал ссылку на функцию на параметр обратного вызова. То, что вы делаете сейчас, вызывает функцию.

// Definition of the callback function 
this.getListOfPossibleDrives = function (chosenBook) {
     // Your code when a book is selected
}

// Configuration for the comboBox
var config = {
    fieldLabel    : i18n._('Department code'),
    xtype         : 'combo',
    ...
    store         : ...,
    listeners     : {
        scope   : this,
        'select': self.getListOfPossibleDrives
    }
}

Когда в параметре или объекте вы выполняете somefunction () (со скобками / скобками), вы фактически вызываете функцию, так что вам нужно в своей конфигурации или определять функцию как вы уже делали в начале, или передавая ссылку на другую функцию.

Это не волшебство, это только то, что вы можете передавать функции в качестве параметров. Например, вы можете получить следующее:

this.myFunctionOne = function (myStringParam) {
    // Do things
}

this.anotherFunction = function (callback) {
    // Do things... and call a callback function received as param
    callback('hello');
}

this.anotherFunction(this.myFunctionOne);

// Or you can do directly
this.anotherFunction(function(param) {
    console.log(param);
});

// With ES6 syntax
this.anotherFunction((param) => {
    console.log(param);
});

Когда вы передаете функцию, вам не нужно указывать параметры, которые она должна получить.

anotherFunction будет вызывать обратный вызов (полученная функция) со строкой hello , поэтому в зависимости от функции она будет выполнять то или иное действие:

[112 ]

Последний напечатает: Я печатаю другое сообщение: привет

0
ответ дан Eduardo Yáñez Parareda 1 March 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: