在过去的几个月里,我一直在看 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
的任何类型。