2

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

我正在围绕 ENet 库 ( http://enet.bespin.org ) 编写一个 rust 包装器。我的目标是使 rust API 尽可能与 C API 相似,除了重构将 C 样式句柄指针转换为结构对象的成员函数的函数。我想保持 API 相似,以便官方 C 文档同样适用于 rust wrapper。

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没有为 generic 提供任何解决方案A。我尝试了以下方法,但这也不起作用,因为ToSocketAddr没有实现 trait core::kinds::Sized

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

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

4

1 回答 1

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

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

于 2014-12-04T00:59:32.137 回答