gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:05:38 25 4
gpt4 key购买 nike

过去几个月我一直在关注 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() 就像一个魅力。然而,第二次调用不会编译。

Rustc 返回

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 的类型。

关于rust - 指定为特征而不是具体类型的可选函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com