>백엔드 개발 >C++ >람다 식이 foreach 루프의 각 반복 동안 해당 값 대신 반복기 변수의 최종 값을 캡처하는 이유는 무엇입니까?

람다 식이 foreach 루프의 각 반복 동안 해당 값 대신 반복기 변수의 최종 값을 캡처하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 08:43:02660검색

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

반복자 변수를 사용하는 람다 표현식의 예기치 않은 동작

주어진 코드에서 myClass.Execute()를 호출할 때 예상되는 출력은 "Hi"입니다. 문자열", "안녕 싱글", "안녕 Int32." 그러나 코드는 "Hi Int32"를 세 번 인쇄합니다. 예상치 못한 동작이 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?

문제는 foreach 루프 내에서 사용되는 람다 표현식에 있습니다.

var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));

이 코드에서 루프 변수 유형은 다음과 같습니다. 람다 표현식으로 캡처되었습니다. 그러나 캡처되는 것은 특정 반복의 유형 값이 아니라 변수 자체에 대한 참조입니다.

따라서 나중에 PrintHelloType 대리자가 호출되면 끝에 있는 유형의 값을 사용합니다. 루프는 "Int32"입니다. 이로 인해 예기치 않은 결과가 발생합니다.

해결책:

원하는 목표를 달성하려면 새 변수를 사용하여 각 반복 중에 유형 값을 캡처할 수 있습니다.

foreach (var type in types)
{
   var newType = type;
   var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
   helloMethods.Add(sayHello);
}

이제 각 람다 표현식은 특정 반복에 대한 올바른 값인 newType의 값을 캡처합니다. 그러면 예상되는 출력인 "Hi String", "Hi Single", "Hi Int32"가 생성됩니다.

위 내용은 람다 식이 foreach 루프의 각 반복 동안 해당 값 대신 반복기 변수의 최종 값을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.