模块类型不匹配
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
中,您编写添加模块 ip
和 mask
,但这些已添加到 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
函数中使用它。
我正在制作用于验证和计算 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
中,您编写添加模块 ip
和 mask
,但这些已添加到 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
函数中使用它。