할 수 있습니다하지 않는 이상, 아니 그 기능.
우선, 일반 변수를 사용할 수 없습니다. 즉, x
은 T
에 의존 할 수 없습니다. 간단한 예를 들자면하려면이 작동
fn test<T>(_: &T) { unimplemented!() }
fn main() {
let x: fn(&u8) = test;
}
를 컴파일러 (u8
,이 경우) T
는 구체적인 유형을 추론 할 수 있기 때문이다. 그러면 왜 그렇게 할 수 없습니까? 때문에 F
. 종결 유형을 요구하고 종결 유형은 익명 입니다.; 당신이하는 일에 상관없이, 당신은 이름을 지을 수 없습니다. 유형 시스템을 으로 변경하면 클로저 유형이 유추 되겠지만 은 정확히 특정 클로저 중 하나에서만 유효합니다. 함수와 매우 유사하게, 각각의 클로저는 이면서도 실제로는 인 경우에도 고유 한 고유 한 유형을가집니다. 함수와 달리 클로저에는 사용할 수있는 공통 기본 유형이 없습니다.
실제로 무엇을 달성하려고하는지 알지 못해서 어떤 권장 사항을 제시하기가 어렵습니다.
pub fn take_while2<'a,T>(initial: &'a [T], predicate: Box<Fn(&T) -> bool>) -> Option<&'a [T]> { // '
// ...
}
fn main() {
let functions: Vec<for<'a> fn(&'a [u8], Box<Fn(&u8) -> bool>) -> Option<&'a [u8]>> = vec![take_while2]; // '
// ...
}
참고 용 'a
일반적인 매개 변수와 같은 기능을 가지고 더 높은 순위 수명이다 for<'a>
의 사용 : 어둠 속에서 자상을 위해, 그러나, 당신은 뭔가를 시도 할 수도 있습니다 take_while2
정의. 또한이 구문 은이 형식 인수에 대해 작동하지 않습니다.
도을 사용할 수 있음을 알리기 위해 Shepmaster에게 신용을 표합니다. 박스형 폐쇄 대신에 &Fn(&T) -> bool
을 사용하십시오. 이를 통해 호출자에 대한 힙 할당 요구 사항이 해제됩니다.
이렇게하면 predicate
에 전달할 클로저를 입력해야합니다.
또한 heap-allocate 할 필요없이 특성 개체를 참조 ('& Fn (& T) -> bool')로 사용할 수도 있습니다. – Shepmaster
@Shepmaster : 알다시피, 나는 그들을 완전히 잊었다. * 편집 모바일로! * –
철저한 답변을 해주셔서 감사드립니다! 그것은 도대체 무슨 일이 일어나고 있는지 이해하기 위해 잠시 시간이 걸릴 것입니다. 알파에 이르는 시점에서 녹이 머리를 복잡하게 뒤집어 썼습니다. Fn은 fn으로 선언 한 함수의 유형입니까? 상자 안에있는 것은 무엇을 의미합니까? 이것은 함수를 호출 할 때마다 로컬 변수가 모두 힙에 할당된다는 것을 의미합니까? –