一、mod.rs和lib.rs
mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式;
lib.rs是一个库或子库层次综合在一起的有效方式;
songroom@staff-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()->Vec<Bar>;
}
#[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的文件。
二、对外开放
在每层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中约束库开放的对象为rfn_for_c函数,以及Bar,以及GetBar.
在lib.rs层次,再次明确对外开放的层次。
三、另外一种方式:include
除了mod.rs,lib.rs之外,还有一种特别的导入形式,include.
songroom@staff-NB-146:~/myffi/test$ ls -R
.:
bind.rs const.txt
bind.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::*;//表明导入lib.rs下的开放范围的对象
struct foo;
fn main() {let student = Student{name: "wowotuo".to_string(),age:18};let bar = Bar::new();//可以访问println!("bar:{:?}",bar);//let tick = Tick; //因为mod.rs中没有开放Tick的访问权限,故不能访问//println!("tick:{:?}",tick);rfn_for_c();println!("student :{:?}",student);rfn_for_c();println!("const :{:?}",MIN_VALUE);println!("Hello, world!");
}
另外,在这个工程下,cargo.toml文件应加下如下部分:
[dependencies.rusttoc]
path = "../rusttoc" #库的位置
这样,就是main.rs中导入了rusttoc库,以及include了两个文件进来了。
Running `/home/songroom/myffi/work/target/release/work`
bar:Bar { open: 0.0, close: 0.0, min: 0.0, max: 0.0 }
call from rust fn abs :6
call from rust fn sqrt :6
student :Student { name: "wowotuo", age: 18 }
call from rust fn abs :6
call from rust fn sqrt :6
const :30000.0
Hello, world!
songroom@staff-NB-146:~/myffi/work/src$