如何使用不同文件的共享逻辑?

时间:2015-05-17 12:28:06

标签: rust

共享逻辑:

// euler/shared/lib.rs

pub fn foo() {
    println!("shared::foo()");
}

如何在不同的文件中使用它:

// euler/001/main.rs

use super::shared; // error: unresolved import `super::shared`

fn main() {
  shared::foo(); // how to access it?
}
// euler/002/main.rs

use super::shared; // error: unresolved import `super::shared`

fn main() {
  shared::foo(); // how to access it?
}

2 个答案:

答案 0 :(得分:5)

mdup's answer是正确的,但我鼓励您使用Rust的包裹经理Cargo。它会为你做两件非常重要的事情:

  1. 设置rustc的正确命令行参数。
  2. 更改时自动重建依赖库。
  3. 使用cargo new sharedcargo new --bin euler-001生成正确的目录结构。将您的共享代码移至shared/src/lib.rs,将二进制文件移至euler-001/src/main.rs

    .
    ├── euler-001
    │   ├── Cargo.toml
    │   └── src
    │       └── main.rs
    └── shared
        ├── Cargo.toml
        └── src
            └── lib.rs
    

    然后,编辑euler-001/Cargo.toml并添加依赖项部分:

    [dependencies.shared]
    path = "../shared"
    

    调整你的main.rs以了解箱子:

    extern crate shared;
    
    fn main() {
        shared::foo();
    }
    

    现在,您只需在cargo run目录中输入euler-001

    $ cargo run
       Compiling shared v0.1.0 (file:///private/tmp/play/euler-001)
       Compiling euler-001 v0.1.0 (file:///private/tmp/play/euler-001)
         Running `target/debug/euler-001`
    shared::foo()
    

    请注意,您不必记住命令行参数,并且会为您编译内容!拥有内置的包管理器非常棒!

答案 1 :(得分:4)

一种解决方案是从共享代码中创建库。这将允许您使用extern crate声明。

// euler/shared/shared.rs
pub fn foo() {
    println!("shared::foo()");
}

编译lib:

$ cd euler/shared
$ rustc --crate-type=lib shared.rs
$ ls -l libshared.rlib                                                                                                
-rw-r--r--  1 mdup  wheel  6758 May 17 14:38 libshared.rlib

以下是在“客户端”代码中使用它的方法:

// euler/001/main.rs

extern crate shared;

fn main() {
  shared::foo();
}

编译客户端:

$ cd euler/001
$ rustc -L ../shared main.rs
$ ls -l main
-rwxr-xr-x  1 mdup  wheel  291420 May 17 14:42 main
$ ./main
shared::foo()

Rust By Example,“Crates”部分,"Library"页和"extern crate"部分中的更多信息。