模块类型不匹配

Mismatched types with modules

我正在制作用于验证和计算 IP 的小程序。 我想试用模块,但遇到错误,我不知道如何解决,也无法在互联网上找到任何内容。

这是我的项目结构:

src/
    ip.rs
    main.rs
    mask.rs
    show.rs   

ip.rs

pub struct Ip {
    pub first: u8,
    pub second: u8,
    pub third: u8,
    pub forth: u8,

    pub bin: [bool; 32]
}



pub fn build_ip(ip: String) -> Ip {
    let split = ip.replace(".", ":");
    let split = split.split(":");
    let split_vec = split.collect::<Vec<&str>>();
    let mut bin: [bool; 32] = [false; 32];
    let mut octets: [u8; 4] = [0; 4];

    if split_vec.len() != 4 {
        panic!("Wrong amount of octets!");
    }
    for i in 0..4 {
        let octet: u8 = match split_vec[i].trim().parse() {
            Ok(num) => num,
            Err(_) => panic!("Something wrong with first octet"),
        };
        octets[i] = octet;

        let soctet = format!("{:b}", octet);
        for (j, c) in soctet.chars().enumerate() {
            bin[j + i*8] = c == '1';
        }
    }


    Ip {
        first: octets[0],
        second: octets[1],
        third: octets[2],
        forth: octets[3], 
        bin: bin
    }
}

show.rs

#[path = "ip.rs"] mod ip;
#[path = "mask.rs"] mod mask;

pub use ip::Ip;


pub fn print(name: String, ip: ip::Ip) {
    println!("{}: ", name);
    println!("{}.{}.{}.{}", ip.first, ip.second, ip.third, ip.forth);
    for c in ip.bin.iter() {
        print!("{}", *c as i32);
    }
    println!("");
    println!("");
}

main.rs

pub mod mask;
pub mod ip;
pub mod show;

fn main() {
    let ip = ip::build_ip("255:255:25:8:0".to_string());
    // let mask = mask::build_mask("255.255.255.252".to_string());
    show::print("ip".to_string(), ip)
}

当我尝试编译时,它向我抛出这个,我不知道该怎么做:

 --> src\main.rs:9:32
  |
9 |     show::print("ip".to_string(), ip)
  |                                   ^^ expected struct `show::ip::Ip`, found struct `ip::Ip`

show.rs 中,您编写添加模块 ipmask,但这些已添加到 main.rs

相反,在 show.rs 中使用如下内容:

use crate::ip::Ip;

pub fn print(name: String, ip: Ip) {
    ...
}
#[path = "ip.rs"] mod ip;
#[path = "mask.rs"] mod mask;

这声明了新的子模块,独立于 mod.rs 中声明的子模块。它们具有相同的源代码并不重要,就类型检查和对象标识而言,它们完全无关。

基本上,您已经定义了以下结构:

pub mod mask { ... }
pub mod ip {
    pub struct Ip { ... }
    pub fn build_ip(ip: String) -> Ip { ... }
}
pub mod show {
    mod ip  {
        pub struct Ip { ... }
        pub fn build_ip(ip: String) -> Ip { ... }
    }
    mod mask { ... }
    pub fn print(name: String, ip: ip::Ip) { ... }
}

如果你想导入 模块,你应该使用use。如果你需要导入兄弟模块,你可以使用 crate:: 段(为了从当前 crate 的根目录开始解析),或者 super::(从当前模块向上移动一个级别)。

所以这里 show 应该包含 use crate::{ip, mask}use super::{ip, crate} 以便“看到”它的兄弟姐妹。

use ip::Ip;pub 也完全没有必要,你需要它只是因为你声明了一个新的 ip 模块,因此需要 its Ip 是 public 因为你在 pub 函数中使用它。