过去几个月我一直在看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>) {
...
}
有没有办法可以做到这一点,还是我需要采取不同的方法?
答案 0 :(得分:3)
fn main() {
create_host(Some("localhost:12345"));
create_host(None::<&str>);
}
我在这里选择&str
,因为它与第一次调用时的类型相同,因此编译器不会生成通用函数的另一个单态版本。您可以选择实现ToSocketAddr
的任何类型。