在rust中实例化枚举时出错

在rust中实例化枚举时出错,rust,Rust,我正在尝试这样做: use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; // A network pub enum IpNetwork { V4(Ipv4Network), V6(Ipv6Network), } pub struct Ipv4Network { addr: Ipv4Addr, prefix: u8, } pub struct Ipv6Network { addr: Ipv6Addr, pre

我正在尝试这样做:

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

// A network
pub enum IpNetwork {
    V4(Ipv4Network),
    V6(Ipv6Network),
}

pub struct Ipv4Network {
    addr: Ipv4Addr,
    prefix: u8,
}

pub struct Ipv6Network {
    addr: Ipv6Addr,
    prefix: u8,
}

impl Ipv4Network {
    fn new(addr: Ipv4Addr, prefix: u8) -> Ipv4Network {
        Ipv4Network { addr:addr, prefix:prefix }
    }
}

impl Ipv6Network {
    fn new(addr: Ipv6Addr, prefix: u8) -> Ipv6Network {
        Ipv6Network { addr:addr, prefix:prefix }
    }
}

impl IpNetwork {
    pub fn new(ip: IpAddr, prefix: u8) -> IpNetwork {
        match ip {
            IpAddr::V4(a) => IpNetwork::V4(a, prefix),
            IpAddr::V6(a) => IpNetwork::V6(a, prefix),
        }
    }
}

fn main() {
    let ip = Ipv4Addr::new(77, 88, 21, 11);
    let cidr = IpNetwork::new(ip, 24);
}
这给了我:

src/lib.rs:34:30: 34:54 error: this function takes 1 parameter but 2 parameters were supplied [E0061]
src/lib.rs:34             IpAddr::V4(a) => IpNetwork::V4(a, prefix),
                                           ^~~~~~~~~~~~~~~~~~~~~~~~
src/lib.rs:35:30: 35:54 error: this function takes 1 parameter but 2 parameters were supplied [E0061]
src/lib.rs:35             IpAddr::V6(a) => IpNetwork::V6(a, prefix),
                                           ^~~~~~~~~~~~~~~~~~~~~~~~
src/lib.rs:42:31: 42:33 error: mismatched types:
 expected `std::net::ip::IpAddr`,
    found `std::net::ip::Ipv4Addr`
(expected enum `std::net::ip::IpAddr`,
    found struct `std::net::ip::Ipv4Addr`) [E0308]
src/lib.rs:42     let cidr = IpNetwork::new(ip, 24);
                                            ^~
error: aborting due to 3 previous errors

rust为什么认为构造函数只接受一个参数?

变量的形式是
V4(Ipv4Network)
,因此您应该传递
Ipv4Network
,例如
Ipv4Network::new(a,前缀)


变量的形式为
V4(Ipv4Network)
,因此您应该传递
Ipv4Network
,例如
Ipv4Network::new(a,前缀)


变量的形式为
V4(Ipv4Network)
,因此您应该传递
Ipv4Network
,例如
Ipv4Network::new(a,前缀)


变量的形式为
V4(Ipv4Network)
,因此您应该传递
Ipv4Network
,例如
Ipv4Network::new(a,前缀)


您的代码中有两个错误:

第一个错误是,例如,通过传递地址元组和前缀来构造
IpNetwork::V4
。如果您查看如何定义
IpNetwork

// A network
pub enum IpNetwork {
   V4(Ipv4Network),
   V6(Ipv6Network),
}
您需要为
IpNetwork::V4
提供
struct Ipv4Network
,而不仅仅是
(a,前缀)
的元组。这同样适用于
IpNetwork::V6
。通过这些调整,您的匹配支架将变为:

pub fn new(ip: IpAddr, prefix: u8) -> IpNetwork {
    match ip {
        IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
        IpAddr::V6(a) => IpNetwork::V6(Ipv6Network::new(a, prefix)),
    }
}
第二个错误是在主方法中。您正在构造
Ipv4Addr
,并试图将其作为参数传递给
IpNetwork
。而
IpNetwork
只接受
IpAddr
。所以你会错过这一部分:

let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
下面是一个在不稳定参数下失败的解决方案


要使此代码段正常工作,您需要制作一个板条箱并添加
#![功能(ip地址)]
以使其通过编译器检查
IpAddr
和变体显然正在返工。

您的代码中有两个错误:

第一个错误是,例如,通过传递地址元组和前缀来构造
IpNetwork::V4
。如果您查看如何定义
IpNetwork

// A network
pub enum IpNetwork {
   V4(Ipv4Network),
   V6(Ipv6Network),
}
您需要为
IpNetwork::V4
提供
struct Ipv4Network
,而不仅仅是
(a,前缀)
的元组。这同样适用于
IpNetwork::V6
。通过这些调整,您的匹配支架将变为:

pub fn new(ip: IpAddr, prefix: u8) -> IpNetwork {
    match ip {
        IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
        IpAddr::V6(a) => IpNetwork::V6(Ipv6Network::new(a, prefix)),
    }
}
第二个错误是在主方法中。您正在构造
Ipv4Addr
,并试图将其作为参数传递给
IpNetwork
。而
IpNetwork
只接受
IpAddr
。所以你会错过这一部分:

let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
下面是一个在不稳定参数下失败的解决方案


要使此代码段正常工作,您需要制作一个板条箱并添加
#![功能(ip地址)]
以使其通过编译器检查
IpAddr
和变体显然正在返工。

您的代码中有两个错误:

第一个错误是,例如,通过传递地址元组和前缀来构造
IpNetwork::V4
。如果您查看如何定义
IpNetwork

// A network
pub enum IpNetwork {
   V4(Ipv4Network),
   V6(Ipv6Network),
}
您需要为
IpNetwork::V4
提供
struct Ipv4Network
,而不仅仅是
(a,前缀)
的元组。这同样适用于
IpNetwork::V6
。通过这些调整,您的匹配支架将变为:

pub fn new(ip: IpAddr, prefix: u8) -> IpNetwork {
    match ip {
        IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
        IpAddr::V6(a) => IpNetwork::V6(Ipv6Network::new(a, prefix)),
    }
}
第二个错误是在主方法中。您正在构造
Ipv4Addr
,并试图将其作为参数传递给
IpNetwork
。而
IpNetwork
只接受
IpAddr
。所以你会错过这一部分:

let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
下面是一个在不稳定参数下失败的解决方案


要使此代码段正常工作,您需要制作一个板条箱并添加
#![功能(ip地址)]
以使其通过编译器检查
IpAddr
和变体显然正在返工。

您的代码中有两个错误:

第一个错误是,例如,通过传递地址元组和前缀来构造
IpNetwork::V4
。如果您查看如何定义
IpNetwork

// A network
pub enum IpNetwork {
   V4(Ipv4Network),
   V6(Ipv6Network),
}
您需要为
IpNetwork::V4
提供
struct Ipv4Network
,而不仅仅是
(a,前缀)
的元组。这同样适用于
IpNetwork::V6
。通过这些调整,您的匹配支架将变为:

pub fn new(ip: IpAddr, prefix: u8) -> IpNetwork {
    match ip {
        IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
        IpAddr::V6(a) => IpNetwork::V6(Ipv6Network::new(a, prefix)),
    }
}
第二个错误是在主方法中。您正在构造
Ipv4Addr
,并试图将其作为参数传递给
IpNetwork
。而
IpNetwork
只接受
IpAddr
。所以你会错过这一部分:

let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
下面是一个在不稳定参数下失败的解决方案


要使此代码段正常工作,您需要制作一个板条箱并添加
#![功能(ip地址)]
以使其通过编译器检查
IPADR
和变体显然正在重新加工。

它只需要一个参数,看起来您的意思是
IPADR::V4(a)=>IpNetwork::V4(Ipv4Network::new(a,前缀))
谢谢,我的错。请回答这个问题,我可以接受。它只需要一个参数,看起来你的意思是
IpAddr::V4(a)=>IpNetwork::V4(Ipv4Network::new(a,前缀))
谢谢,我的错。请回答这个问题,我可以接受。它只需要一个参数,看起来你的意思是
IpAddr::V4(a)=>IpNetwork::V4(Ipv4Network::new(a,前缀))
谢谢,我的错。请回答这个问题,我可以接受。它只需要一个参数,看起来你的意思是
IpAddr::V4(a)=>IpNetwork::V4(Ipv4Network::new(a,前缀))
谢谢,我的错。请回答这个问题,我可以接受。