map(lambda s: s * s, [1, 2, 3])python 的 lambda 語法很好理解,冒號前是參數,冒號後是程式碼。lambda 的限制就程式碼只能夠一行。lambda 可以存取外部變數,但是不能使用 assignment statement。
package main import ( "fmt" ) func map_func(array []int, fun func(int)int){ for index, element := range array{ array[index] = fun(element) } } func main(){ v := []int{1, 2 ,3 ,4 , 5} fmt.Println(v) map_func(v, func(s int)int{return s * s}) fmt.Println(v) }
golang 也很好懂。匿名函數就和一般函數一樣。沒有一行的限制(一行限制大概只有 python 有吧),不可以存取外部變數,可以使用 assignment statement (因為就和函數一樣阿)。
基本上, javascript 和 golang 語言差不多。只差在 golang 語言要宣告型態,javascript 可以存取外部變數。目前我只兩道這兩個差別,可能也有其他差別吧。
[1, 2, 3].forEach(function(entry) { console.log(entry); });
接下來,我們來看看 c++11 的 lambda 語法。他的語法比起上面的語法,都還要複雜多了。完整的規格可以看 cpp ref。我只講第二個形式。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ vector <int> v = {1, 2, 3, 4, 5}; int data = 3; int counter = 0; for_each(v.begin(), v.end(), [data, &counter](int s) -> int{ counter += 1; cout << s * data << endl; }); cout << "counter: " << counter << endl; return 0; }
c++ 的範例就比較複雜些,但是也提供比較多功能。例如他可以選擇匿名函數可以存去外部的那些變數。就 python 和 javascript 而言,他是可以存取所有外部變數的。而 golang則是禁止存取。
c++ 的 lambda 範例和其他語言不一樣。他的形式長的很特別。其他程式語言看到 lambda 的語法大概猜得出來是幹嘛的。 c++ 就比較難猜了。他把三種括號都用上了XD
沒有留言:
張貼留言