类型与模块不匹配

1 module rust

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

这是我的项目结构:

src/
    ip.rs
    main.rs
    mask.rs
    show.rs   
Run Code Online (Sandbox Code Playgroud)

ip.rs

src/
    ip.rs
    main.rs
    mask.rs
    show.rs   
Run Code Online (Sandbox Code Playgroud)

显示.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
    }
}
Run Code Online (Sandbox Code Playgroud)

主程序.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!("");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mas*_*inn 5

#[path = "ip.rs"] mod ip;
#[path = "mask.rs"] mod mask;
Run Code Online (Sandbox Code Playgroud)

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

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

#[path = "ip.rs"] mod ip;
#[path = "mask.rs"] mod mask;
Run Code Online (Sandbox Code Playgroud)

如果你想导入模块,你应该使用use. 如果需要导入同级模块,可以使用crate::段(以便从当前包的根开始解析),或super::(从当前模块向上移动一个级别)。

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

for也是完全不必要的,您只需要它pubuse ip::Ip;因为您声明了一个新ip模块,因此需要 Ip是公共的,因为您在函数中使用它pub