2015-01-26 3 views
1

테스트 할 기능의 구현이 몇 가지 있습니다. 이를 깔끔하게하기 위해, 나는 그것들에 대한 참조를 배열에 넣고 하나씩 호출하기를 원한다. 최근의 구문 변경으로 인해이 작업을 수행하려면 먼저 올바른 형식 서명을 사용하여 함수를 함수 참조로 명시 적으로 변환해야합니다. 함수를 선언 할 때 사용하는 구문이 실제 유형과 다르므로이 작업은 간단하지 않습니다.함수에 대한 참조 (형식)를 어떻게 알 수 있습니까?

사소한 서명이있는 녹 기능에 대한 참조 유형을 어떻게 파악합니까 (예 : 제네릭, 수명, 다른 기능 가져 오기 등)?

특정 function (내가 쓴) 서명 선언 :

pub fn take_while2<'a,T,F:Fn(&T)->bool >(initial: &'a [T], predicate: F) -> Option<&'a [T]> {...} 

답변

2

할 수 있습니다하지 않는 이상, 아니 그 기능.

우선, 일반 변수를 사용할 수 없습니다. 즉, xT에 의존 할 수 없습니다. 간단한 예를 들자면하려면이 작동

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에 전달할 클로저를 입력해야합니다.

+0

또한 heap-allocate 할 필요없이 특성 개체를 참조 ('& Fn (& T) -> bool')로 사용할 수도 있습니다. – Shepmaster

+0

@Shepmaster : 알다시피, 나는 그들을 완전히 잊었다. * 편집 모바일로! * –

+0

철저한 답변을 해주셔서 감사드립니다! 그것은 도대체 무슨 일이 일어나고 있는지 이해하기 위해 잠시 시간이 걸릴 것입니다. 알파에 이르는 시점에서 녹이 머리를 복잡하게 뒤집어 썼습니다. Fn은 fn으로 선언 한 함수의 유형입니까? 상자 안에있는 것은 무엇을 의미합니까? 이것은 함수를 호출 할 때마다 로컬 변수가 모두 힙에 할당된다는 것을 의미합니까? –