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

这篇具有很好参考价值的文章主要介绍了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

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

#[derive(Debug)]
pub struct Tick;
pub trait GetBar{
    fn get_bar(&self)->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的文件。

二、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文件夹下,放了两个不同后缀的文件。

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::*;
struct Strategy;
//实现本地库中的trait
impl GetBar for Strategy{
    fn get_bar(&self)->Vec<Bar>{
        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了两个文件进来了。

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!

上面分别实现本地库中trait,调用了const,相关函数和struct等。文章来源地址https://www.toymoban.com/news/detail-730529.html

到了这里,关于Rust :mod.rs和lib.rs中use的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust软件外包开发语言的特点

    Rust 是一种系统级编程语言,强调性能、安全性和并发性的编程语言,适用于广泛的应用领域,特别是那些需要高度可靠性和高性能的场景。下面和大家分享 Rust 语言的一些主要特点以及适用的场合,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公

    2024年02月12日
    浏览(49)
  • 【rust/egui】(六)看看template的app.rs:TextEdit

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 文本编辑框 其定义为: 用起来可能是个简单的东西,但是实际上很是复杂,首先我们来看看它的外观以及用法 在 app.rs 中,我们是通

    2024年02月11日
    浏览(54)
  • 【rust/egui】(七)看看template的app.rs:Slider

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 滑块,如下图 定义: 我们可以通过 ui.add() 的方式进行添加: 其 new 方法的定义为: 参数 value 为可变借用类型,且使用 Numeric 特性进

    2024年02月10日
    浏览(38)
  • 【rust/egui】(三)看看template的app.rs:序列化、持久化存储

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 app.rs 中首先定义了我们的 TemplateApp 结构体 在定义 TemplateApp 时,我们让其继承了 serde::Deserialize, serde::Serialize 。 serde 是rust中用于序列

    2024年02月11日
    浏览(39)
  • 【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 侧边栏,如下图 其定义为: 通过 right() 或 left() 方法生成: 方法实现与 TopBottomPanel::top() 类似: 生成时的默认属性值为: 我们可以将

    2024年02月11日
    浏览(40)
  • 【rust/egui】(四)看看template的app.rs:update以及组件TopBottomPanel&Button

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 update 实际上还是 eframe::App 的特征,并非 egui 的内容。其官方注解如下: update 函数会在需要重绘ui(或者其他)的时候被调用,一秒可能

    2024年02月11日
    浏览(44)
  • 【Rust指南】use关键字妙用|模块内容拆分

      书接上文,本篇补充rust 组织管理中模块的细节知识,比如模块拆分。此外介绍 use 的习惯用法,快速引用自定义模块内容或标准库,以此优化代码书写。 如果我说 use 与C/C++中的 include 或者是java、python中的 import 用法类似,想必此时的你定是头一歪,脑子里蹦出两

    2023年04月10日
    浏览(31)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(53)
  • 【rust语言】rust多态实现方式

    学习rust当中遇到了这个问题,记录一下,不对地方望指正 多态是面向对象程序设计中的一个重要概念,指同一个行为或操作在不同实例上具有不同的行为或结果。简单来说,多态就是指同一种类型的对象,在不同的上下文中有不同的行为。多态性使得程序可以更加灵活、可

    2024年02月11日
    浏览(46)
  • C语言和Rust语言的互相调用(2)(Rust调用C)

    1.创建项目 rust调用c方式挺多的,这里采用最通俗易懂的方法,用构建脚本进行构建整个项目。 2.编辑build.rs的内容 这里的build.rs:若要创建构建脚本,我们只需在项目的根目录下添加一个 build.rs 文件即可。这样一来, Cargo 就会先编译和执行该构建脚本,然后再去构建整个项

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包