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

  • 本文关键字:类型 参数 函数 为特征 rust enet
  • 更新时间 :
  • 英文 :


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

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

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()就像一个魅力。但是,第二个调用将无法编译。

鲁斯特克回归

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

我猜发生错误是因为None没有为通用A提供任何解决方案。我尝试了以下内容,但这也不起作用,因为ToSocketAddr没有实现特征core::kinds::Sized.

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

有没有办法做到这一点,或者我需要采取不同的方法?

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

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

最新更新