在 Rust 中实例化枚举时出错
Error while instantiating an enum in 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,
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, prefix)
:
IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
您的代码中有两个错误:
第一个错误是你通过传递地址和前缀的元组构造 IpNetwork::V4
。如果你看看你是如何定义 IpNetwork
:
// A network
pub enum IpNetwork {
V4(Ipv4Network),
V6(Ipv6Network),
}
您需要为 IpNetwork::V4
提供 struct Ipv4Network
而不仅仅是 (a, prefix)
的元组。 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)),
}
}
第二个错误是在 main 方法中。您正在构建 Ipv4Addr
并试图将其作为参数传递给 IpNetwork
。而 IpNetwork
只接受 IpAddr
。所以你会错过这部分:
let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
这里是 playpen link 因参数不稳定而失败的解决方案。
要使此代码段正常工作,您需要创建一个 crate 并添加 #![feature(ip_addr)]
以使其通过编译器检查。 IpAddr
和变体显然正在重做。
我正在尝试这样做:
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, prefix)
:
IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)),
您的代码中有两个错误:
第一个错误是你通过传递地址和前缀的元组构造 IpNetwork::V4
。如果你看看你是如何定义 IpNetwork
:
// A network
pub enum IpNetwork {
V4(Ipv4Network),
V6(Ipv6Network),
}
您需要为 IpNetwork::V4
提供 struct Ipv4Network
而不仅仅是 (a, prefix)
的元组。 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)),
}
}
第二个错误是在 main 方法中。您正在构建 Ipv4Addr
并试图将其作为参数传递给 IpNetwork
。而 IpNetwork
只接受 IpAddr
。所以你会错过这部分:
let addr = IpAddr::V4(ip);
let cidr = IpNetwork::new(addr, 24);
这里是 playpen link 因参数不稳定而失败的解决方案。
要使此代码段正常工作,您需要创建一个 crate 并添加 #![feature(ip_addr)]
以使其通过编译器检查。 IpAddr
和变体显然正在重做。