【问题标题】:How can I use shared logic from different files?如何使用来自不同文件的共享逻辑?
【发布时间】:2015-05-17 12:28:06
【问题描述】:

有共享逻辑:

// 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?
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    mdup's answer 是正确的,但我鼓励你使用 Rust 的包管理器 Cargo。它将在这里为您做两件非常重要的事情:

    1. rustc 设置正确的命令行参数。
    2. 在依赖库发生变化时自动重建它们。

    使用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();
    }
    

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

    $ 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()
    

    请注意,您不必记住命令行参数,系统会为您编译!有一个内置的包管理器很棒!

    【讨论】:

    • 确实cargo方式和手动链接方式都是正确的,都有自己的用例!手动链接非常适合一次性程序(例如 Project Euler 练习),但是当您第一次需要安装软件包时,您会很高兴投资货物结构。 +1
    【解决方案2】:

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

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

    编译库:

    $ 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,“板条箱”部分,页面"Library""extern crate"

    【讨论】:

    • 感谢您的回答。我很喜欢。我正在标记@Shepmaster 的答案,因为它是此问题的推荐解决方案。对于正在寻找此问题的解决方案的人来说,最好将其突出显示。谢谢。
    猜你喜欢
    • 2014-09-26
    • 2020-07-25
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多