过去几个月我一直在关注 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>) {
...
}
有没有办法可以做到这一点,还是我需要采取不同的方法?