익명 함수,lambda 표현 식,패키지(closure)의 차이 점 과 역할 분석

익명 함수,lambda 표현 식,패키지(closure)의 차이 점 과 역할 분석
모든 주류 프로 그래 밍 언어 는 함수 식 프로 그래 밍 을 지원 합 니 다.예 를 들 어 c+11,python 과 자바 에는 lambda 표현 식,lua 와 JavaScript 에는 클 로 저(closure),ObjectC 에는 블록(blocks,^)이 있 습 니 다.그렇다면 이 몇 가지 개념 은 어떤 공통점 과 차이 가 있 을 까?일반 함수 만 으로 는 안 되 는 것 일 까?왜 이런 시 크 한 개념 을 만 들 었 을 까?
익명 함수,lambda,closure 차이
기능 적 으로 lambda 와 closure(또는 OC 의 blocks)는 하나의 것 으로 서로 다른 언어의 다른 호칭 일 뿐 익명 함수 입 니 다.익명 함수 가 외부 변 수 를 캡 처 했다 면 클 로 저 입 니 다.
2.익명 함수,lambda,closure 역할
쉽게 말 하면 이들 을 끌 어 들 이 는 역할 은 두 가지 가 있다.
간결 하 다
포획 변수
먼저 간결 하 게 말 하면 익명 함 수 는 다른 함수 내부 에서 설명 하고 정의 할 수 있 습 니 다.이름 함 수 를 따로 쓰 지 않 고 밤 을 들 어 c+vector 의 모든 값 을 표시 합 니 다.익명 함 수 를 사용 하지 않 으 면 코드 는 이 렇 습 니 다.
 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 void show(int & value) {
 7     std::cout << "value " << value << std::endl;
 8 }
 9 
10 int main() {
11     vector<int> * v = new vector<int>(3, 1);
12 
13     for_each(v->begin(), v->end(), show);
14 
15     return 0;
16 }

익명 함 수 를 사용 하면 다음 과 같 습 니 다:
 1 #include <iostream>
 2 #include <vector>
 3 #include <functional>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int main() {
 8     vector<int> * v = new vector<int>(3, 1);
 9 
10     for_each(v->begin(), v->end(), [](int & v){ 11 std::cout << "value " << v << std::endl; 12  });
13 
14     return 0;
15 }

캡 처 변 수 는 무엇 입 니까?익명 함 수 를 익명 함수 에서 정의 할 수 있 는 변 수 를 사용 할 수 있 도록 하 는 것 입 니 다.그러나 익명 함수 내의 함수 외 변 수 는 외부 변수의 clone(C++11 은 clone 이 아 닌 인용 을 캡 처 할 수 있 습 니 다.OC 에는block,외부 변수의 값 을 직접 변경 할 수도 있 습 니 다).익명 함수 에서 외부 변 수 를 수정 하면 외부 변수 에 영향 을 주지 않 습 니 다.클 로 저 는 함수+캡 처 변수 라 고 할 수 있 습 니 다.lua 를 예 로 들 면:
 1 local intValue = 10;
 2 
 3 local func = function (p)
 4     intValue = intValue + p;
 5     return intValue;
 6 end
 7 
 8 print(func(3));
 9 print(func(3));
10 print(intValue)

인쇄 결 과 는 13,16,10 입 니 다.익명 함수 의 외부 변수 가 func 에 포착 되 었 음 을 알 수 있 습 니 다.
3.익명 함수,lambda,closure 가 각 언어 에서 사용 하 는 방식:
  1.ObjectC:
ObjectC 에서 익명 함 수 는 blocks(블록)라 고 불 린 다.즉,포획 의 원 가 를 바 꿀 수도 있 고,복 제 를 포획 할 수도 있 지만,복제 값 의 값 을 바 꿀 수 없다.외부 값 을 포획 하고 변경 하려 면block,그렇지 않 으 면 복사 문 이 잘못 되 었 습 니 다.코드 를 사용 하면 다음 과 같 습 니 다.
 1 #import <Foundation/Foundation.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         __block int foo = 10;
 6         
 7         int (^blockFunc)(int p) = ^(int p) {
 8             foo += p;
 9             return foo;
10         };
11         
12         NSLog(@"%d", blockFunc(4));
13         
14         NSLog(@"%d", foo);
15     }
16     return 0;
17 }  

  2.C++:
C++에서 익명 함 수 는 lambda 라 고 불 린 다.즉,포획 의 원 가 를 바 꿀 수 있 고,복제 도 할 수 있 으 며,복제 값 의 값 도 바 꿀 수 있다.문법 형식 은 다음 과 같이 간단하게 요약 할 수 있다.
  [capture](params)ops->ret{body;}
capture 는 캡 처 목록 입 니 다.params 는 매개 변수 표 입 니 다.opt 는 선택 가능 한 옵션 입 니 다.ret 는 반환 값 형식 이 고 body 는 함수 체 입 니 다.구체 적 으로 어떻게 사용 하 는 지 는 C++11 lambda 표현 식 해석 과 C++11 lambda 표현 식 을 참고 할 수 있 습 니 다.
  3.lua:
lua 의 익명 함 수 는 패키지(closure)라 고 불 리 며,원래 값 의 클론 만 캡 처 하고 변경 할 수 있 으 며,원래 값 을 변경 할 수 없습니다(table 제외).
  4.python:
python 의 익명 함 수 는 lambda 라 고 불 리 며 클론 값 만 잡 을 수 있 을 뿐 변경 할 수 없습니다.

좋은 웹페이지 즐겨찾기