2019年5月9日 星期四

[C/C++] Lambda Expression

Lambda Expression,Wiki翻譯成匿名函數,顧名思義就是沒有名稱的函數,撰寫高階語言則會時常可看這類型的表達方式,尤其是在使用Callback Function類型時,可以將函數名稱撰寫在Callback的變數位置上,反而可使閱讀性更高也更簡潔。例如
  • JavaScript 
    # 不使用Lambda Expression
    function cbSuccess() {
        console.log("HelloWorld");
    };

    $.ajax({
        type : "GET",

        url : "/example",
        success : cbSuccess
    });


    # 使用Lambda Expression
    $.ajax({
        type : "GET",
        url : "/example",
        success : function(){
            console.log("HelloWorld");
    }});

從C++11也開始支持Lambda Expression的表示方式,
  • 語法:[Captures](Parameter) throw -> ret {Body}
    • [Captures]:Lambda Expression一定是有[ ]為開頭,而Capture則可定義傳入參數
      • [ ]:沒定義任何變量
      • [=]:所有變數都以By Value傳入
      • [&]:所有變數都以By Reference傳入
      • [x,&y]:x變數使用ByValue;&y變數使用By Reference
      • [=,&y]:變數的以By Value傳入,除了&y變數使用By Reference
      • [&,x]:變數的以By Reference傳入,除了x變數使用ByValue
      • [this]:傳入物件this参数
    • (Parameter):如不傳參數,該欄位則可省略。而參數需要符合以下3條限制
      • 參數不能有預設值
      • 不能有可變長參數列
      • 不能有無名參數
    • throw:例外状况
    • -> ret:回傳值形態
    • {Body}: 函數主題
  • 範例:[]
    auto func = []() { cout << "HelloWorld"; }
    or
    auto func = [] { cout << "HelloWorld"; } 
  • 範例2:[=]
    int i = 10;
    auto func = [](int i) { cout << "HelloWorld"; }
    func(i);
Reference:
[1] C++11 Lambda Expression 語法教學與範例
[2] C++ Lambda表达式基本用法
[3] 匿名函式

沒有留言:

張貼留言