2017-12-29 28 views

답변

4

하나 하나 분해 해 봅시다. 상자

Box<T>

는 포인터이다 힙 할당 T을. 특성 개체는 포인터 뒤에 만 있기 때문에 여기에서 사용합니다.

특성은 Fn() + Send + 'statictrait object 타입, Box<Fn() + Send + 'static>에서

개체. 앞으로는 혼동을 피하기 위해 written Box<dyn (Fn() + Send + 'static)>이 될 것입니다.

인사이드 dyn은 원래 유형에 대한 제한입니다. T: Fn() + Send + 'static 일 때 Box<T>Box<Fn() + Send + 'static>으로 강제 변환 될 수 있습니다. 따라서 원본 유형을 알 수는 없지만 Fn()Send'static (유효 기간은)이라고 가정 할 수 있습니다.

Fn()

Clone 또는 Default처럼 특징이다. 그러나 특수한 구문의 설탕을 사용합니다.

  • Fn(A1, ..., An)Fn<(A1, ..., An), Output=()>의 구문 설탕입니다.
  • Fn(A1, ..., An) -> RFn<(A1, ..., An), Output=R>의 구문 설탕입니다.
  • 이 구문 설탕은 Fn, FnMut, FnOnceFnBox과 같은 특성에도 적용됩니다.

그럼 Fn은 무엇을 의미합니까? T: Fn(A1, ..., An) -> Rx: T이 인수가 A1, ..., An이고 반환 유형이 R 인 호출 가능 객체임을 의미합니다. 함수 포인터와 클로저를 예로들 수 있습니다.

보내기

Send이 유형의 값은 스레드를 통해 전송 될 수 있다는 것을 의미한다. auto trait이기 때문에 can be specified as the second boundsdyn 유형 (특성 개체 유형)입니다.

'static 정확히 하나의 수명이을 결합해야합니다 사실

, dyn 유형 (특성 개체 유형)를 구속. 그것은 생략 될 때 추측됩니다. 추론 규칙은 RFC 0192RFC 1156에 설명되어 있습니다.기본적으로 다음과 같습니다 :

  1. 명시 적으로 주어진 경우 해당 수명을 사용하십시오.
  2. 그렇지 않으면 내부 특성에서 유추됩니다. 예를 들어 Box<Any>Any: 'static이므로 Box<Any + 'static>입니다.
  3. 특성의 수명이 적절하지 않으면 외부 유형에서 추론됩니다. 예를 들어 &'a Fn()&'a (Fn() + 'a)입니다.
  4. 심지어 실패하면 'static (기능 서명의 경우) 또는 익명의 수명 (기능 본문의 경우)으로 변경됩니다.

결론

f: Box<Fn() + Send + 'static> 스레드와를 통해 전송 될 수있다, (아무 인수 나 돌아올 수없는 값) 등의 폐쇄 등 (변경 동적 알 수없는 원본 유형)을 호출 값으로 소유 포인터입니다 프로그램 자체만큼 길다.

+0

자세한 설명은 Masaki에게 감사드립니다. 하나의 화제가 아닌 질문 :'Box <&i32>'은'heap'에 포인터/참조를 할당하고'빌린 내용 (i32)'(가리키는 데이터)이 스택에있을 수 있다는 것을 의미합니까? ''b = 박스 ''를 쓰면,''i = 12 ''와''b ''가 100을 얻게 될 것입니다 ('let m = 100, b : Box= Box :: new (print32) '여기서'autorefs' – soupybionics

관련 문제