Closure라는 가상의 클로저 타입을 만들고 필드가 어떤식으로 되는지 살펴보자
일단 Closure 내부에 Closure를 그대로 박으면 에러가 터짐
재귀타입이 돼서 컴파일러가 타입 크기를 계산할수가 없게됨
대신 &나 Arc등의 공유참조타입으로 우회하면 컴파일은 가능해짐 문제는 이걸로는 FnMut나 FnOnce를 대응할수 없는데다가 &는 스택 수명따라가고 Arc등은 느림
결국 값으로는 못만들고 참조는 제약이 심해서 자기안에 자기 타입을 넣고 여타 클로저처럼 쓰는건 굉장히 어렵다
하지만 클로저 안에서 자신의 환경변수를 가지고 재귀를 하는거 자체는 얼마든지 가능함 그냥 멤버 메소드 그대로 호출하면됨
하지만 불행하게도 이건 아직 러스트 언어 스펙에 존재하지 않는 기능임
현 시점에서 클로저 재귀를 쓰고싶으면 루프를 쓰던가 함수로 만들던가하자
캡처 안하는 람다는 재귀가 되는데 언어 스펙상 없다 - 이말이군요 ㅇㅅㅇ
캡쳐안하는 람다가 아니라 자기환경갖고 재귀하는게 된다는거임
재귀 하는 방법이 1. 자기 클로저를 캡쳐하기 2. 클로저 안에서 클로저 객체를 접근하기 3. 특수 키워드로 재귀하기 이거 3개인데 1번은 소유권상 아주 힘들고 2번 3번은 스펙상 없음
변수 선언 안하고 재귀 람다 가능한 언어 어떤것들 있음?
선언이 어떤걸 말하는지는 모르겠는데 되는 언어들은 다 이방식으로 함 let foo = || { foo() }