2015-01-26 1 views
9

함수 (또는 함수 포인터)를 테스트 용으로 배열에 고정하는 방법은 무엇입니까?어떻게 함수 포인터를 배열에 저장할 수 있습니까?

fn foo() -> isize { 1 } 
fn bar() -> isize { 2 } 

fn main() { 
    let functions = vec![foo, bar]; 
    println!("foo() = {}, bar() = {}", functions[0](), functions[1]()); 
} 

Rust playground

이에이 코드는 오류 코드 내가 얻을 수 있습니다 :

error: mismatched types: 
expected `fn() -> isize {foo}`, 
    found `fn() -> isize {bar}` 
(expected fn item, 
    found a different fn item) [E0308] 

    let functions = vec![foo, bar]; 
           ^~~ 

녹 같은 서명을 갖는에도 불구하고 내 기능 (값)와 같은 다른 유형을 치료하는 I 놀랍다.

+0

예,이 중복 결말은 컴파일러에게 힌트를 줄 (functions의 유형을 참고) 필요가있다. –

+0

복제본 인 경우 중복 된 내용을 표시하여 관리 할 수 ​​있습니다! 이 질문은 틀린 또는 도움이되지 않는 대답으로 다른 (비슷한) 질문에 반대되는 것처럼 많은 도움이되었습니다. –

답변

10

최근에 어떤 시점에서 각 기능에 대해 고유 한 고유 한 유형이 부여되었습니다 ... 이유는 기억하지 않습니다.

fn foo() -> isize { 
    1 
} 
fn bar() -> isize { 
    2 
} 
fn main() { 
    let functions: Vec<fn() -> isize> = vec![foo, bar]; 
    println!("foo() = {}, bar() = {}", functions[0](), functions[1]()); 
} 

또한과 같이이 작업을 수행 할 수 있습니다 :

let functions = vec![foo as fn() -> isize, bar]; 
+0

고마워요! 유스 케이스가 점점 어려워지는 것을 보는 것은 언제나 수치 스럽습니다. 나는이 변화가 일어날 이유가 있었기를 바랍니다. 왼쪽에있는 유형에 주석을 달아주는 것은 내가 아직하지 않은 함수 유형 서명을 작성하는 방법을 알고 있다면 그렇게 나쁘지 않습니다 ~. –

+0

"fn 항목"은 다음과 같은 이점이 있습니다. 가상 호출 인 함수 포인터를 통한 호출을 방지합니다. LLVM은 최적화 단계에서 해당 호출을 * devirtualize *시킬 수 있지만 fn 항목 및 unboxed closure 호출은 최적화 도구를 사용하지 않고 항상 직접 호출해야합니다. – bluss

+0

배열에 넣을 수는 있지만, let 함수 = [foo (fn() -> isize, bar는 fn() -> isize]; 또는'let 함수 : [fn() -> isize; 2] = [foo, bar];'. 또한 let 함수를 만들 수도 있습니다 : & [fn() -> isize] = & [foo, bar];'. – Shepmaster