클로저는 언제 Fn, FnMut 및 FnOnce를 구현합니까?


114

, 및 특성 을 구현하기위한 클로저 의 특정 조건 은 무엇입니까 ?FnFnMutFnOnce

그건:

  • 때 폐쇄 않습니다 하지 구현 FnOnce특성을?
  • 때 폐쇄 않습니다 하지 구현 FnMut특성을?
  • 때 폐쇄 않습니다 하지 구현 Fn특성을?

예를 들어, 몸체에서 클로저 상태를 변경하면 컴파일러가 구현되지 않습니다 Fn.


11
클로저에 대한 최근의 훌륭한 기사를 보셨습니까 ?
Shepmaster

답변:


126

특성은 각각 call_...메서드 의 시그니처 , 특히 다음 유형으로 표시되는 클로저 / 함수에 대한 점점 더 제한적인 속성을 나타냅니다 self.

  • FnOnce( self)는 한 번 호출 할 수있는 함수입니다.
  • FnMut( &mut self)는 &mut환경에 액세스 할 수있는 경우 호출 할 수있는 함수입니다.
  • Fn( &self)는 &환경 에만 액세스 할 수있는 경우 호출 할 수있는 함수입니다.

클로저 |...| ...는 가능한 한 많은 것을 자동으로 구현합니다.

  • 모든 클로저는 구현합니다 FnOnce: 한 번 호출 할 수없는 클로저는 이름을 가질 가치가 없습니다. 클로저가를 구현하는 경우 FnOnce한 번만 호출 할 수 있습니다.
  • 캡처에서 벗어나지 않는 클로저는를 구현 FnMut하여 두 번 이상 호출 할 수 있습니다 (함수 객체에 대한 비 앨리어싱 액세스가있는 경우).
  • 캡처에 대한 고유 / 변경 가능한 액세스가 필요하지 않은 클로저는를 구현 Fn하여 본질적으로 모든 곳에서 호출 할 수 있습니다.

이러한 제한 self은 클로저 의 유형 및 구조로의 "디스가 링" 에서 직접 따릅니다 . 내 블로그 게시물 Finding Closure in Rust에 설명되어 있습니다.

클로저에 대한 정보는 클로저 : Rust 프로그래밍 언어 에서 환경캡처 할 수있는 익명 함수 문서를 참조하십시오 .


클로저가를 구현한다면 FnOnce한 번만 호출 할 수 있다는 의미입니까?
nalply

@nalply, 예, 한 번만.
huon

9
나는 nalply의 코멘트를 잘못 읽었고 그것은 나에게 약간의 혼란을 일으켰다. "폐쇄하면 미래의 리더, 그는 말했다하시기 바랍니다 참고 구현을 FnOnce".
sleeparrow

2
구현 세부 사항 : 가능한 한 많은 것을 자동으로 구현합니다. 전적으로 사실이 아니며 필요한 경우 자동으로 구현합니다. 특수화를 사용하여 FnMut 인수에 사용 된 클로저에 대해 누락 된 Fn-impl을 감지 할 수 있습니다. 이것은 버그입니다 github.com/rust-lang/rust/issues/26085
bluss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.