익명 함수,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 라 고 불 리 며 클론 값 만 잡 을 수 있 을 뿐 변경 할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.