2015-04-17 3 views
0

я пытаюсь сделать это:Ошибка при инстанцировании перечисления ржавчины

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 

Почему ржавчина думает конструктор принимает один аргумент?

+1

Он принимает только один аргумент, похоже, что вы имели в виду 'IpAddr :: V4 (a) => IpNetwork :: V4 (Ipv4Network :: new (a, prefix))' – Lee

+0

Спасибо, мой плохой. Пожалуйста, сделайте это ответом, я могу это принять. –

ответ

1

Есть две ошибки в коде:

Первая ошибка, что вы, например, построить 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)), 
    } 
} 

Вторая ошибка в основном методе. Вы строите Ipv4Addr и пытаетесь передать его IpNetwork в качестве параметра. Пока IpNetwork принимает только IpAddr. Таким образом, вы будете без вести этой части:

let addr = IpAddr::V4(ip); 
let cidr = IpNetwork::new(addr, 24); 

Вот playpen link к решению, которое терпит неудачу на нестабильных параметрах.

Чтобы этот фрагмент работал, вам нужно сделать ящик и добавить #![feature(ip_addr)], чтобы он передавал проверки компилятора. IpAddr и варианты, по-видимому, переработаны.

2

варианты имеют вид V4(Ipv4Network), так что вы должны быть пропусканием Ipv4NetworkIpv4Network::new(a, prefix), такие как:

IpAddr::V4(a) => IpNetwork::V4(Ipv4Network::new(a, prefix)), 
Смежные вопросы