Module 如何将生锈模块放在单独的文件中?

Module 如何将生锈模块放在单独的文件中?,module,rust,package,Module,Rust,Package,下面的代码改编自“TheBook”(RustopDocs--book),并以单个.rs文件的形式工作。我只是希望模块驻留在一个单独的文件中。我读过《这本书》的第7章,“用包、板条箱和模块管理不断增长的项目”。我只是不明白“它”。我的想法是,“main”代码属于main.rs,模块可能需要在lib.rs中,但确切的形式和位置仍然是个谜。本章通常说明运行“cargo new/build which”,但没有说明从哪个目录运行。类似地,它声明src/main.rs或src/lib.rs在特定示例中应该

下面的代码改编自“TheBook”(RustopDocs--book),并以单个.rs文件的形式工作。我只是希望模块驻留在一个单独的文件中。我读过《这本书》的第7章,“用包、板条箱和模块管理不断增长的项目”。我只是不明白“它”。我的想法是,“main”代码属于main.rs,模块可能需要在lib.rs中,但确切的形式和位置仍然是个谜。本章通常说明运行“cargo new/build which”,但没有说明从哪个目录运行。类似地,它声明src/main.rs或src/lib.rs在特定示例中应该是这样或那样的,但不清楚(没有完整路径)一个“src”目录是否实际位于另一个目录的相同位置

所以,我想有不止一种方法可以做到这一点,但我很乐意给出一个相对简单的答案。在本例中,我只关心模块是否可以从下面的main()函数访问

mod guess_mod {
    
    pub struct Guess {
        value: i32,
    }

    impl Guess {
        pub fn new(value: i32) -> Guess {
            if value < 1 || value > 100 {
                panic!("Guess value must be between 1 and 100, got {}.", value);
            }
            Guess{value}
        } 
        pub fn value(&self) -> i32 {
            self.value
        }
    }
}


use guess_mod::Guess;


fn print_guess_value(guess: Guess) {
        println!("The value of the guess is {} ", guess.value());
}


fn main() {
    let g = Guess::new(18);
    print_guess_value(g);
}
mod guess\u mod{
pub结构猜测{
值:i32,
}
简单猜测{
pub fn new(值:i32)->Guess{
如果值<1 | |值>100{
恐慌!(“猜测值必须介于1和100之间,得到{}.”,value);
}
猜测{value}
} 
发布fn值(&self)->i32{
自我价值
}
}
}
使用guess_mod::guess;
fn打印猜测值(猜测:猜测){
println!(“猜测的值是{}”,guess.value());
}
fn main(){
设g=Guess::new(18);
打印值(g);
}

您可以在
src
中创建以下文件夹结构:

src
├── guess
│   └── mod.rs
└── main.rs
您的guess模块可以位于名为
guess.rs
的文件中,也可以位于名为
guess/
的文件夹中,其中包含
mod.rs
(如上面的结构所示)

在您的
mod.rs
(或
guess.rs
)中,您可以放置模块的内容):

您可以从文件夹结构的根目录运行cargo(即
src


如果rust book对您来说不够清晰,可以通过示例尝试rust:

您可以在
src
中创建以下文件夹结构:

src
├── guess
│   └── mod.rs
└── main.rs
您的guess模块可以位于名为
guess.rs
的文件中,也可以位于名为
guess/
的文件夹中,其中包含
mod.rs
(如上面的结构所示)

在您的
mod.rs
(或
guess.rs
)中,您可以放置模块的内容):

您可以从文件夹结构的根目录运行cargo(即
src


如果生锈书对你来说不够清楚,也许可以举个例子试试生锈:

也许你混淆了板条箱和模块的概念。它们有些关联,但有所不同

  • 板条箱是编译、分发、版本控制和依赖关系管理的独立单元
  • 模块是逻辑上分离的板条箱的一部分,可视性屏障也可能单独编译,但最终链接在一起,并捆绑到板条箱中
如果你说C,你可以看到板条箱是库,模块是编译单元。或者,如果你谈论C++或C语言,你可以看到模块是命名空间。除此之外,可执行文件也是板条箱,但种类不同

现在,如何创建它们?最简单的是模块。有三种选择:

模块#1 将模块内联写入其他文件中:

//src/main.rs
mod foo {
   pub fn test() {}
}

fn main() {
    foo::test();
}
模块#2 将模块写入同一源目录中的单独文件:

//src/main.rs
mod foo;

fn main() {
    foo::test();
}
//src/main.rs
mod foo;

fn main() {
    foo::test();
}
您可以在名为
src/foo
的子目录中添加
foo
的子模块

模块#3 将模块写入子目录时,文件必须命名为
mod.rs

您可以使用子目录
src/foo
创建
foo
的子模块

板条箱 链接板条箱最简单的方法是将其添加到
Cargo.toml
[dependencies]
部分。那么
cargo
就是魔法

创建板条箱时,它可能有0或1个库和0或多个二进制文件。通常的模式是创建双货物项目,该项目包含库和二进制文件。然后您将有一个
src/main.rs
和一个
src/lib.rs
文件。依赖关系是自动处理的

//src/main.rs
fn main() {
    foo::test();
}

对于更复杂的项目,您可以将源代码拆分为几个板条箱,并将它们一起处理到一个工作区中,但我认为这超出了这个问题的范围。

也许您将板条箱和模块的概念混为一谈。它们有些关联,但有所不同

  • 板条箱是编译、分发、版本控制和依赖关系管理的独立单元
  • 模块是逻辑上分离的板条箱的一部分,可视性屏障也可能单独编译,但最终链接在一起,并捆绑到板条箱中
如果你说C,你可以看到板条箱是库,模块是编译单元。或者,如果你谈论C++或C语言,你可以看到模块是命名空间。除此之外,可执行文件也是板条箱,但种类不同

现在,如何创建它们?最简单的是模块。有三种选择:

模块#1 将模块内联写入其他文件中:

//src/main.rs
mod foo {
   pub fn test() {}
}

fn main() {
    foo::test();
}
模块#2 将模块写入同一源目录中的单独文件:

//src/main.rs
mod foo;

fn main() {
    foo::test();
}
//src/main.rs
mod foo;

fn main() {
    foo::test();
}
您可以在名为
src/foo
的子目录中添加
foo
的子模块

模块#3 将模块写入子目录时,文件必须命名为
mod.rs

您可以使用子目录
src/foo
创建
foo
的子模块

板条箱 链接板条箱最简单的方法是将其添加到
Cargo.toml
[dependencies]
部分。那么
cargo
就是魔法

创建板条箱时,它可能有0或1个库和0或多个二进制文件。通常的模式是创建双货物项目,该项目具有库和二进制all
//src/lib.rs
pub fn test() {}