rust 教程 06 crates和modules

news/2025/3/22 10:41:25/文章来源:https://www.cnblogs.com/xwher/p/18786242

我们将讨论rust中的crates和modules的概念来帮助组织项目

crates

rust程序是由crates组成的,每个crate是单个库或可执行文件以及一些可选信息。

当使用cargo build --verbose来构建时,可以看到依赖信息;我们也可以在Cargo.toml中指定依赖的版本信息。

[dependencies]
num = "0.4"

当编译库rlib时,rust使用--crate-type lib的选项;编译称二进制时,使用--crate-type bin. 当rust程序依赖外部库时,通常会传递--extern来告知外部库名称。当然这些并不需要显式指定。

当编译成release版本时,使用cargo build --release,这将生成更高效的代码。

build profile

Cargo.toml中存在一些配置设置,影响rustc的命令行参数:

命令行 cargo.toml section
cargo build [profile.dev]
cargo build --release [profile.release]
cargo test [profile.test]

为了更好地利用profiler,我们可能需要在release版本下,保留debug 的符号

[profile.release]
debug = true

modules

crates是项目之间的共享;而module是项目内的共享,作为rust的名字空间:

mod spores {use cell::{Cell, Gene};pub struct Spore {}pub(crate) fn test() {}
}

注意pub(crate)意味着它可以在crate内的任何位置被访问,但并不作为外部接口导出。

嵌套modules

pub(super)可以使得item只对parent module可见;pub(in <path>)可以使得item对特定的parent及其后代可见,

将modules划分为多个文件

一个module也可以这样写,mod spores;;这里我们是让rust去找这个spores存在的文件。注意rust不会分离地编译module,当重新build时,会重新编译所有的module。

考虑一个复杂的组织:

fern_sim/
|-- Cargo.toml
--- src/--- main.rs--- spores.rs--- plant/--- mod.rs--- leave.rs--- stems/--- ph.rs--- xy.rs--- stems.rs

我们可以在stems.rs 声明两个新的submodules:

pub mod ph;
pub mod xy;

路径和导入

use 类似于C++中的use

注意submodule不会自动继承父module的item,可以使用 use super::来指定。

使用use ::image;表示使用外部的image crate; 当前module也可以通过self指定。

标准prelude

statics & consts

pub const PI: f64 = 3.14; // 类似 #definepub static PI: f64 = 3.14; // 可以被ref

把一个程序转为库

lib.rs

fern_sim/
--- cargo.toml
--- src/--- bin/--- rfern.rs

cargo run --bin rfern可以编译对应的二进制文件。

Attributes

rust程序中的任何item都可以被attr修饰

条件编译:

#[cfg(target_os="android")]
mod mobile;

一些常用cfg:

option 什么时候用
test test被开启时
debug_assertions debug assert被开启时
unix 只为unix系统编译,包括macos
windows
target_pointer_width = "64" 64 位
target_arch = "x86_64" 面向x86_64
target_os = "macos"
feature = "robots" 特定的feature
not(A)
all(A, B)
any(A, B)

考虑一种不会被自动内联的情况:当定义在一个crate的函数或方法被另一个crate调用时,除非是generic或是#[inline]显式注解。

为了给整个crate标注属性,需要在开头使用#!

test

使用#[test]进行标注

#[test]
fn math_test() {assert_eq!(0+1, 1);
}

可以使用debug_assert!等,将不会在release模式下编译

为了测试失败的情况,应使用#[should_panic(expected="h")]

注意test只有在cargo test时才会编译;如果有很多代码,可以将其组织为test module,如下

#[cfg(test)]
mod tests {#[test]fn //
}

Workspace

当项目中存在多个crates,可以使用workspace的概念进行组织,例如在顶层目录新建一个Cargo.toml

[workspace]
members = ["fern_sim"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter:bottomNavigationBar+PageView切换页面,使页面可以滑动切换

一,代码: tabbar: import package:flutter/material.dart; import ../tabpages/MyHomePage.dart; import ../tabpages/ProfilePage.dart;class MyTabBar extends StatefulWidget {const MyTabBar({super.key});@overrideState<MyTabBar> createState() => _MyTabBar…

flutter:用底部导航栏切换页面

一,代码: tabbar页面: import package:flutter/material.dart; import ../tabpages/MyHomePage.dart; import ../tabpages/ProfilePage.dart;class MyTabBar extends StatefulWidget {const MyTabBar({super.key});@overrideState<MyTabBar> createState() => _MyTa…

ASE13N45-ASEMI照明驱动专用ASE13N45

ASE13N45-ASEMI照明驱动专用ASE13N45编辑:LL ASE13N45-ASEMI照明驱动专用ASE13N45 型号:ASE13N45 品牌:ASEMI 封装:TO-220F 最大漏源电流:13A 漏源击穿电压:450V 批号:最新 RDS(ON)Max:0.45Ω 引脚数量:3 沟道类型:N沟道MOS管 封装尺寸:如图 特性:MOS管、N沟道M…

CORIDIC算法学习记录

目录问题问题分析CORDIC算法原理逼近方法及步骤逼近过程中的符号确定根据角度计算正切值举个例子逼近\(\theta=50^{\degree}\)并求其正切值 CORDIC算法叫坐标旋转数字计算法,由J.Volder在1959年提出,可以快速且简单的计算角度的数值。 问题已知\(y,x\),如何快速计算角度\(\t…

郑州商转公直还办理流程-2025年3月

先叠个甲,因为时间、地点、银行及每个人的情况可能都不一样,最终流程和结果可能也不一样,建议根据自己情况提前咨询,以下为我个人真实经历,仅供参考。 时间线:1.2025.3.10周一,去贷款行办理《同意提前结清商业贷款函》、《同意提前结清商业贷款函》、余额证明,12号周三…

设计一种将方向盘的旋转角度转换为USB信号的装置,用于汽车驾驶模拟

量角器是一种专门的设备,用于高精度测量旋转角度,并通过USB将这些测量结果传输到主机。它集成了一个精确的编码器,能够以1度的精度测量角度。树莓派Pico通过可编程I/O (Programmable I/O)高速读取编码器信号,而TinyUSB库则用于与主机共享数据。该量角器的开发主要是为了解决…

郑州商转公直还办理流程

时间线:1.2025.3.10周一,去贷款行办理《同意提前结清商业贷款函》、《同意提前结清商业贷款函》、余额证明,12号周三电话我已出好,可以去公积金中心办商转公了;2.2025.3.17周一,去公积金中心办理商转公直还,周四下午收到已放款短信,周五早上接到贷款行电话提醒去办提前…

构建一个2.4GHz无线网络分析仪,可兼作远程(LoRa)收发器

快速预览 呈现DualCast !我最新的(也是最先进的)项目。它是一种紧凑型无线设备,除了能够通过LoRa技术发送915MHz AES-128加密的远程命令外,还能够分析2.4GHz Wi-Fi网络上的实时流量。(默认设置下最高可达一公里!)翻转180以激活Wi-Fi模式。此外,它还配备了许多传感器,如用于…

Vue3 关闭vueDevTools工具

1、文件 vite.config.ts 2、注释

SecureCRT SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输

SecureCRT & SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输SecureCRT & SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输 rock-solid terminal emulation & flexible secure file transfer for com…

deepseek模型部署到本地使用+投喂数据训练

近期,由于国外大量攻击,导致 DeepSeek 经常无法使用;另外,许多朋友希望在本地搭建自己的知识库,以保护自己的资料不被外泄。因此,越来越多的人希望能够在本地部署 DeepSeek,但对于技术难度有所担忧。别担心,这篇教程将为你扫清所有障碍!从环境搭建到模型运行,每一步都…