那家专门做特卖的网站,关于我们网站模板,淄博市建设业协会网站,有哪些网站或者公司招募做视频的一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式#xff1b; lib.rs是一个库或子库层次综合在一起的有效方式#xff1b;
下面举个实例来说明。生成一个rusttoc本地库#xff08;由cargo new rusttoc --lib所生成#xff09;#xff0c;目录…一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式 lib.rs是一个库或子库层次综合在一起的有效方式
下面举个实例来说明。生成一个rusttoc本地库由cargo new rusttoc --lib所生成目录结构如下
songroomstaff-NB-146:~/myffi/rusttoc/src$ ls -R
.:
bar lib.rs./bar:
data.rs ffi.rs mod.rs其中data.rs文件内容如下
#[derive(Debug)]
pub struct Tick;
pub trait GetBar{fn get_bar(self)-VecBar;
}
#[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 }}
}
其中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)});
}此外在上面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不暴露lib.rs文件
pub mod bar;
pub use bar::*;在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文件夹下放了两个不同后缀的文件。
songroomstaff-NB-146:~/myffi/test$ ls -R
.:
bind.rs const.txtbind.rs
#[derive(Debug)]
struct Student{name : String,age:i32,
}const.txt
const MIN_VALUE:f64 30000.0_f64;四、调用库和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)-VecBar{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!);
}另外在这个工程下cargo.toml文件应加下如下部分表明需要导入本地库并指明相应的路径
[dependencies.rusttoc]
path ../rusttoc #库的位置这样就是main.rs中导入了rusttoc库以及include了两个文件进来了。
songroomstaff-NB-146:~/myffi/work/src$ cargo run --releaseCompiling work v0.1.0 (/home/songroom/myffi/work)Finished release [optimized] target(s) in 1.68sRunning /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!上面分别实现本地库中trait,调用了const,相关函数和struct等。