可选的函数参数,指定为特征而不是具体类型

时间:2014-12-03 23:19:05

标签: rust enet

过去几个月我一直在看Rust,但我刚刚开始实际项目。我不确定标题中的术语是否正确。请让我知道如何纠正。

我正在ENet库(http://enet.bespin.org)周围写一个防锈包装器。我的目标是使rust 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()的第一次调用就像一个魅力。然而,第二个调用将无法编译。

Rustc返回

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

我猜这个错误正在发生,因为None没有为通用A提供任何解决方案。我尝试了以下操作,但由于ToSocketAddr没有实现特征core::kinds::Sized,因此无法正常工作。

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

有没有办法可以做到这一点,还是我需要采取不同的方法?

1 个答案:

答案 0 :(得分:3)

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

我在这里选择&str,因为它与第一次调用时的类型相同,因此编译器不会生成通用函数的另一个单态版本。您可以选择实现ToSocketAddr的任何类型。