2014-12-03 4 views
1

지난 몇 달 동안 녹을보고 있었지만 방금 실제 프로젝트를 시작했습니다. 제목의 용어가 정확한지 확실하지 않습니다. 그것이 어떻게 시정 될 수 있는지 알려주십시오.구체적인 유형 대신 특성으로 지정되는 선택적 함수 인수

나는 ENet 라이브러리 (http://enet.bespin.org) 주위에 녹 포장지를 쓰고 있습니다. 내 목표는 녹슬지 않는 API를 C API와 비슷한 것으로 유지하는 것입니다. 리팩터링 함수는 C 스타일 핸들 포인터를 사용하여 구조체 개체의 멤버 함수로 처리합니다. API를 비슷하게 유지하여 공식 C 문서가 녹 포장지에도 똑같이 적용될 수 있도록하고 싶습니다.

ENet는 클라이언트 호스트 또는 서버 호스트를 생성하는 단일 함수를 제공합니다. 서버를 만들 때 함수에 IP 주소 구조에 대한 포인터를 전달합니다. 클라이언트를 만들 때 NULL을 전달합니다.

ToSocketAddr 특성과 Option 특성을 사용하여 해당 동작을 에뮬레이트하려고하는데이 문제를 함께 사용하고 있습니다.

이것은 내가 뭘하려고 오전의 감소 예입니다 : 마법처럼

use std::io::net::ip::ToSocketAddr; 

fn create_host<A: ToSocketAddr>(addr: Option<A>) { 
    match addr { 
     Some(a) => println!("Address is {}. Return a server host object.",a.to_socket_addr()), 
     None => println!("no address... Return a client.") 
    }; 
} 


fn main() { 
    create_host(Some("localhost:12345")); 
    create_host(None); 
} 

첫 번째 호출 create_host()하기 위해 노력하고 있습니다. 그러나 두 번째 호출은 컴파일되지 않습니다. 내가 None는 일반 A에 대한 해상도를 제공하지 않기 때문에 해당 오류가 발생하는 추측하고

error: unable to infer enough type information about `_`; type annotations required 

Rustc을 반환합니다. 나는 다음을 시도했다. 그러나 ToSocketAddr이 특성 core::kinds::Sized을 구현하지 않기 때문에 이것은 작동하지 않는다.

fn create_host(addr: Option<ToSocketAddr>) { 
    ... 
} 

내가 할 수있는 방법이 있습니까? 아니면 다른 접근 방식을 취해야합니까?

답변

3
fn main() { 
    create_host(Some("localhost:12345")); 
    create_host(None::<&str>); 
} 

컴파일러는 일반적인 기능의 또 다른 monomorphized 버전을 생성하지 않을 있도록 첫 번째 통화와 동일한 유형은, 그대로 내가 여기 &str을 선택했습니다. ToSocketAddr을 구현하는 유형을 선택할 수 있습니다.

+0

감사합니다. 이전에 어떤 예에서도 'None'에 적용된 구문을 보지 못했습니다. 왜/어떻게 작동하는지 정확히 설명하는 링크가 있습니까? –

+1

[경로] (http://doc.rust-lang.org/reference.html#paths) 및 [일반 기능] (http://doc.rust-lang.org/reference.html#generic-functions)을 참조하십시오. 녹 참조. 'None'은 일반적인 함수가 아니라 generic/polymorphic 상수입니다. 그러나 type 인자 목록 구문은 여전히 ​​적용됩니다. –

+0

감사합니다. 도움이되었습니다. –