• Rust :mod.rs和lib.rs中use的作用


    一、mod.rs和lib.rs
    mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式;
    lib.rs是一个库或子库层次综合在一起的有效方式;

    下面举个实例来说明。生成一个rusttoc本地库(由cargo new rusttoc --lib所生成),目录结构如下:

    songroom@staff-NB-146:~/myffi/rusttoc/src$ ls -R
    .:
    bar  lib.rs
    
    ./bar:
    data.rs  ffi.rs  mod.rs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中,data.rs文件内容如下:

    #[derive(Debug)]
    pub struct Tick;
    pub trait GetBar{
        fn get_bar(&self)->Vec;
    }
    #[derive(Debug)]
    pub struct Bar{
        open:f64,
        close:f64,
        min:f64,
        max:f64,
    }
    impl Bar{
        pub fn new() ->Self{
            Bar { open: 0.0, close: 0.0, min: 0.0, max: 0.0 }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    其中,ffi.rs文件内容如下:

    use std::os::raw::{c_int,c_double};
    extern "C"{
        fn abs(num:c_int) ->c_int;
        fn sqrt(x:c_double) ->c_double;
    }
    #[no_mangle]
    pub extern "C" fn rfn_for_c(){
        println!("call from rust fn abs :{}",unsafe{abs(-6)});
        println!("call from rust fn sqrt :{}",unsafe{sqrt(36.0)});
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    此外,在上面rusttoc库中,在src目录下,除了有lib.rs文件,还有一个bar文件夹,在这个文件夹下,还有3个.rs文件,其中包括一个mod.rs文件。

    很显然,mod.rs是把data.rs和ffi.rs综合在一起对外开放的文件。

    而lib.rs是在rusttoc这个层次,综合起来的一个对外开放的文件。

    当然,如果一个库中,包含若干个子库,那也会存在多个不同层次的lib.rs的文件。

    二、use来管理库内容的对外开放
    在每层mod.rs和lib.rs文件中,要通过use来约束对外开放的程度和范围。

    mod.rs文件

    pub mod ffi;
    pub mod data;
    pub use ffi::rfn_for_c;
    pub use data::{Bar,GetBar};//这里设置Tick不暴露
    
    • 1
    • 2
    • 3
    • 4

    lib.rs文件

    pub mod bar;
    pub use bar::*;
    
    • 1
    • 2

    在mod.rs中,通过pub use来约束ffi.rs和data.rs在此库对外开放(或暴露)的范围,在这里为rfn_for_c函数,以及Bar,以及GetBar。而没有进来的Tick,则表明不对外开放(暴露)。
    在lib.rs层次,再次明确对外开放的层次,使用use表统一表明,各个mod.rs或子lib.rs的统一对外开放。

    如果没有use安排,以上均会处于关闭状态,均无法以本地库或外地库的方式来调用。当然,在use前,还要声明一下各mod。

    三、另外一种方式:include
    除了mod.rs,lib.rs之外,还有一种特别的导入形式,即include。它可以把不同形式文件的内容导入到当到的工作空间。
    下面,在test文件夹下,放了两个不同后缀的文件。

    songroom@staff-NB-146:~/myffi/test$ ls -R
    .:
    bind.rs  const.txt
    
    • 1
    • 2
    • 3

    bind.rs

    #[derive(Debug)]
    struct Student{
        name : String,
        age:i32,
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    const.txt

    const MIN_VALUE:f64 =30000.0_f64;
    
    • 1

    四、调用库和include导入
    另一个rust 二进制工程文件中,有main.rs如下:

    include!("../../test/bind.rs");
    include!("../../test/const.txt");
    pub use rusttoc::*;
    struct Strategy;
    //实现本地库中的trait
    impl GetBar for Strategy{
        fn get_bar(&self)->Vec{
            vec![Bar::new()]
        }
    }
    
    fn main() {
        let student = Student{name: "wowotuo".to_string(),age:18};
        //let tick = Tick;
        let bar = Bar::new();
        let strategy = Strategy;
        println!("bar:{:?}",bar);
        println!("strategy ->get_bar:{:?}",strategy.get_bar());//调用trait
        //let tick = Tick; //因为mod.rs中没有开放Tick的访问权限,故不能访问
        //println!("tick:{:?}",tick);
        println!("student :{:?}",student);
        rfn_for_c();
        println!("const :{:?}",MIN_VALUE);
        println!("Hello, world!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    另外,在这个工程下,cargo.toml文件应加下如下部分,表明需要导入本地库,并指明相应的路径:

    [dependencies.rusttoc]
    path = "../rusttoc" #库的位置
    
    • 1
    • 2

    这样,就是main.rs中导入了rusttoc库,以及include了两个文件进来了。

    songroom@staff-NB-146:~/myffi/work/src$ cargo run --release
       Compiling work v0.1.0 (/home/songroom/myffi/work)
        Finished release [optimized] target(s) in 1.68s
         Running `/home/songroom/myffi/work/target/release/work`
    bar:Bar { open: 0.0, close: 0.0, min: 0.0, max: 0.0 }
    strategy ->get_bar:[Bar { open: 0.0, close: 0.0, min: 0.0, max: 0.0 }]
    student :Student { name: "wowotuo", age: 18 }
    call from rust fn abs :6
    call from rust fn sqrt :6
    const :30000.0
    Hello, world!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面分别实现本地库中trait,调用了const,相关函数和struct等。

  • 相关阅读:
    【C语言】详解 malloc 、calloc函数的区别
    华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker
    过孔设计得越小就越好吗?
    【Flutter】 Flutter 状态管理 BLoC 简明使用指南
    [N1CTF 2022] solve_pow,baby_N1ES
    最详解的正则表达式------贪婪和非贪婪、转义符、分组
    【Gradle-10】不可忽视的构建分析
    【kafka】——Broker
    java基本类型等API 基本语法
    springboot整合swagger
  • 原文地址:https://blog.csdn.net/wowotuo/article/details/133354700