如何在Rust中的模块中拆分代码?

时间:2019-03-08 18:59:03

标签: module compiler-errors rust

我正在阅读Rust Book,在7.2章中,但是我必须缺少一些东西,因为我无法在模块中组织代码,因此编译器(rustc 1.32.0)总是给我错误。 / p>

我读过的东西

  • 我读过rustc --explain E0433,这是编译器的建议,但我仍然无法解决。
  • 我检查了Rust by examples,似乎我的代码是正确的(my/mod.rs在其自己的文件夹中使用模块my/nested.rs
  • 我在Internet上找到了一些信息,但它是4年前的,其中包括use的使用,这在本书中还没有。
  • 我也检查了this question,但是我没有使用文件夹,因此,它脱离了本书的解释。

最小示例

这是一个最小的示例,试图模仿这本书的“声音”示例,只有两个文件:/src/main.rs/src/m.rs

main.rs

mod m;
fn main() {
  let st_0 = m::St::new();
}

m.rs

pub mod m {
    pub struct St {
        a:i32,
        b:i32,
    }
    impl St {
        pub fn new() -> St{
            println!("New St!");
            St {
                a: 12,
                b: 13,
            }
        }
    }
}

这就是cargo告诉我的:

   Compiling min v0.1.0 (/home/user/min)
error[E0433]: failed to resolve: could not find `St` in `m`
 --> src/main.rs:3:19
  |
3 |     let st_0 = m::St::new();
  |                   ^^ could not find `St` in `m`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0433`.
error: Could not compile `min`.

To learn more, run the command again with --verbose.

1 个答案:

答案 0 :(得分:1)

将所有内容保存在一个文件中时,如下所示:

main.rs

pub mod m {
    pub struct St {
        a:i32,
        b:i32,
    }
    impl St {
        pub fn new() -> St{
            println!("New St!");
            St {
                a: 12,
                b: 13,
            }
        }
    }
}

mod m;
fn main() {
  let st_0 = m::St::new();
}

您用

包装模块
pub mod mode_name {
    //code...
}

将模块放在另一个文件中后,包装就会消失The Rust book进行了显示,但是如果您看起来不太仔细,或者如果您编程时喝醉了,则可能会与嵌套模块的pub mod instrument {...}混淆。

所以先生必须看起来像这样:

pub struct St {
    a:i32,
    b:i32,
}
impl St {
    pub fn new() -> St{
        println!("New St!");
        St {
            a: 12,
            b: 13,
        }
    }
}