gpt4 book ai didi

rust - 如何创建具有多个实例化选项的类

转载 作者:行者123 更新时间:2023-11-29 08:19:14 36 4
gpt4 key购买 nike

我想在 Rust 中构建一个类,允许其实例化的多样性和便利性,类似于 std::net::TcpStream 的方式。可以为其 connect 提供多个输入方法。

我进行了以下测试,但对实现此结果需要构建的结构或特征知之甚少。

#[cfg(test)]
mod test {
use super::Ipv4Network;
use std::net::Ipv4Addr;

#[test]
fn instantiation() {
let net_addr = Ipv4Addr::new(10, 0, 0, 0);
let net_mask = Ipv4Addr::new(255, 255, 255, 240);

// Instantiate an Ipv4Network using two Ipv4Addrs.
let with_addrs = Ipv4Network::new(net_addr, net_mask);

// Instantiate an Ipv4Network using an Ipv4Addr and a prefix integer.
let with_addr_prefix = Ipv4Network::new(net_addr, 28);

// Instantiate an Ipv4Network using two strings.
let with_strings = Ipv4Network::new("10.0.0.0", "255.255.255.240");

// Instantiate an Ipv4Network using a string and a prefix integer.
let with_prefix = Ipv4Network::new("10.0.0.0", 28);

// Instantiate an Ipv4Network using a string with CIDR notation.
let with_cidr = Ipv4Network::new("10.0.0.0/28");
}
}

我的理解是std::net::TcpStream完成其倍数 connect通过 ToSocketAddrs 输入特征,可以找到其来源here .究竟如何std::net:TcpStream::connect uses ToSocketAddrs我不清楚,但我想我应该能够定义一个 Ipv4Network如下:

pub struct Ipv4Network {
addr: Ipv4Addr,
mask: Ipv4Addr,
}

如果这是真的,那么我该如何着手创建一个功能类似于 ToIpv4Network 的特征(比如 ToSocketAddrs)为 std::net:TcpStream 做?

应该吃什么肉

impl ToIpv4Network for (Ipv4Addr, Ipv4Addr) {
...
}

看起来像?这是开始下降的正确路径吗?

最佳答案

这是开始工作的合理起点。我认为您的问题之一是您定义的接口(interface)将很难像使用特征编写的那样完成。

那么,让我们谈谈 ToSocketAddrs 的方式作品。首先,让我们快速注意然后忽略 ToSocketAddrs 的事实特征返回 IteratorSocketAddrs .我们忽略它是因为它实际上与手头的问题无关。

这是特征声明的主体:

pub trait ToSocketAddrs {
type Iter: Iterator<Item=SocketAddr>;
fn to_socket_addrs(&self) -> Result<Self::Iter>;
}

此特征的目的是允许它用作 trait bound在通用函数/结构中。从广义上讲,特征边界是一种编写泛型但让 Rust 编译器确保最终实例化泛型的类型实现由该特征(或多个特征)定义的行为的方式。

ToSocketAddrs的情况下这意味着类型可以(可能)转换为 SocketAddr . connect 内部调用的代码然后使用 to_socket_addrs在特征上定义的函数。

顺便说一句,我说可能是因为 to_socket_addrs返回 Result它可以采用 Ok(<success-type>) 的值和 Err(<failure-type>) ,这可能是模拟您的特征的好模式。

这是与我认为您想要的接口(interface)可能不理想(或无法实现,Rust 不直接支持元数或任何其他类型的函数重载)相关的关键点。传递特征绑定(bind)通用参数是实现目标的最简单方法。

关于rust - 如何创建具有多个实例化选项的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33192596/

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