2015-10-17 53 views
1

我想在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通过ToSocketAddrs性状来实现其多种connect输入,其源极可以发现here。究竟如何std::net:TcpStream::connectuses ToSocketAddrs是我也不清楚,但我想我应该能够定义一个Ipv4Network如下:

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

如果这是真的,那么我该如何去创造一个特质(比如ToIpv4Network),其功能像ToSocketAddrs的确为std::net:TcpStream

什么都要的

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

样子的肉吗?这是否正确的道路开始下降?

回答

1

这是一个合理的地方开始,从工作。我认为你的问题之一是你定义的接口将很难完成,如使用特质写的。

那么,让我们来谈谈方式ToSocketAddrs作品。首先,让我们只是很快注意到,然后忽略了ToSocketAddrs特质返回SocketAddrsIterator的事实。我们忽略它,因为它实际上与问题无关。

这里的特质声明体:

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

这种特质的目的是允许它在一个通用的函数/结构被用作trait bound。一般来说,特征边界是写一个泛型的一种方式,但是让Rust编译器确保最终实例化泛型的类型实现了由该特征定义的行为(或特征)。

ToSocketAddrs的情况下,这意味着一个类型可以(可能)被转换到被称为的connect内然后利用对该性状定义的to_socket_addrs函数的SocketAddr。代码。

作为简要之外,我可能说,由于to_socket_addrs返回一个Result这可能需要对Ok(<success-type>)Err(<failure-type>),这可能是一个很好的模式,以你的特质在模型值。

这是一个涉及到为什么我认为你需要的界面可能不理想的关键点(或可实现的,锈不直接支持元数,或任何其他类型的函数重载的)。传递特性绑定泛型参数是实现您的目标的最简单方法。

相关问题