我正在制作用于验证和计算 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)
Run Code Online (Sandbox Code Playgroud)#[path = "ip.rs"] mod ip; #[path = "mask.rs"] mod mask;
这声明了新的子模块,独立于 中声明的子模块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也是完全不必要的,您只需要它pub,use ip::Ip;因为您声明了一个新ip模块,因此需要它 Ip是公共的,因为您在函数中使用它pub。