位置: IT常识 - 正文

Rust极简教程(rust基础操作)

编辑:rootadmin
据说,Rust语言语法的高门槛是劝退很多人上手的主要原因。 确实,Rust语言希望解决 C/C++ 手工管理内存的问题,但是又不想引入类似golang,java的GC机制。 因此,为了能让编译器能够在编译阶段检查出潜在的内存问题,Rust的语法上就多了一些其他语言所没有的规则,这些规则让上手Rust ...

推荐整理分享Rust极简教程(rust基础操作),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:rust 教程,rust 入门教程,rust基础操作,rust 快速入门,rust 入门教程,rust 教程,rust 快速入门,rust 入门教程,内容如对您有帮助,希望把文章链接给更多的朋友!

据说,Rust语言语法的高门槛是劝退很多人上手的主要原因。

确实,Rust语言希望解决 C/C++ 手工管理内存的问题,但是又不想引入类似golang,java的GC机制。因此,为了能让编译器能够在编译阶段检查出潜在的内存问题,Rust的语法上就多了一些其他语言所没有的规则,这些规则让上手Rust的难度提高了不少。

我是觉得,学习一门编程语言,不一定要弄懂其中的所有概念才能开始写代码,就像我们学习外语,掌握了基本几句话之后其实就可以开始对话练习。

这篇极简教程的目的,其实不只是针对Rust,任何编程语言都可以有这么一个极简教程,让大家可以尽快用这种编程语言先把代码写起来,边写边学,不断加深对语言的理解。

因为是极简教程,大纲也很简单,主要3部分:

工程管理变量定义流程控制

《C程序设计语言》中有一句很经典话:程序 = 数据结构 + 算法上面的【变量定义】其实就是数据结构,【流程控制】就是算法,有了这2部分其实就可以编写各种功能。最后加了【工程管理】这部分,一方面是因为Rust的管理工具Cargo是它的重要特色之一;另一方面,良好的代码组织是完成复杂功能的基础,毕竟我们学习Rust,最后是希望用它去完成实际的业务功能的。

工程管理

通过 cargo 创建 Rust项目,可以更好的管理项目的依赖,打包和升级等等。所以,尽管是极简教程,还是希望能用 cargo 来管理项目。

Rust项目一般有两种类型,可执行文件和库。我们一般做的软件或者工具最终都会发布成可执行文件,给用户使用。而库不能单独运行,一般是对重要的功能进行封装,然后作为其他软件的一部分来使用。

创建可执行文件cargo new rust-examplestree . # 工程结构如下.├── Cargo.toml # 这里是工程的配置└── src └── main.rs

其中 main.rs 是启动文件,学习Rust各种语法的时候,可以将代码写在 main.ts 中进行测试。

创建库cargo new --lib rust-libtree ..├── Cargo.toml # 这里是工程的配置└── src └── lib.rs

这里的 lib.rs 和 main.rs 不同,它是不能直接运行的,需要通过里面的测试代码来运行相应的功能。

变量定义

Rust的基本类型和其他语言大同小异,熟悉其他语言(C/C++, golang等)的话,很容易理解。这里我们构造一个简单的学生成绩管理系统,通过定义学生信息,演示下Rust中基本类型以及枚举和结构体的使用。

cargo new stu_managerRust极简教程(rust基础操作)

在 src/main.rs 中定义并打印学生信息。

#[derive(Debug)]enum Sex { Boy, Girl,}struct Student { name: String, // 姓名 age: u16, // 年龄 sex: Sex, // 性别 score: f32, // 成绩}fn main() { let students: [Student; 2] = [ Student { name: String::from("boy01"), age: 18, sex: Sex::Boy, score: 61.5, }, Student { name: String::from("girl01"), age: 16, sex: Sex::Girl, score: 91.5, }, ]; display(&students[0]); display(&students[1]);}fn display(stu: &Student) { println!( "name: {}, age: {}, sex:{:?}, score: {}", stu.name, stu.age, stu.sex, stu.score );}

说明:

#[derive(Debug)]这个是为了打印enum,否则enum类型是不能直接打印的。struct Student这个结构体中定义了常用的基本类型的使用方式。let students: [Student; 2]Rust数组的定义方式。

与其他语言相比,Rust变量的一个新的概念就是所有权和借用规则,我的另一篇博客中有介绍,这里不在赘述。Rust所有权和借用规则示例

除此之外,使用的方式和其他语言区别不大,上面示例中,创建了2个学生信息,并且分别打印出其中各个字段的信息。

$ cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.01sRunning `target/debug/stu_manager`name: boy01, age: 18, sex:Boy, score: 61.5name: girl01, age: 16, sex:Girl, score: 91.5流程控制

掌握了变量定义,可以组织我们的数据,再掌握Rust中的流程控制方法,那么,就能实现实际的业务功能了。

流程控制主要两种:分支和循环。

分支

Rust的分支语法有 if和match两种方式。

继续完善上面的例子,我们增加一个根据成绩区分优良中差的函数,用 if的方式来判断分支。

fn check_score(stu: &Student) { if stu.score >= 90.0 { println!("学员:{}, 成绩优秀", stu.name); } else if stu.score < 90.0 && stu.score >= 75.0 { println!("学员:{}, 成绩良好", stu.name); } else if stu.score < 75.0 && stu.score >= 60.0 { println!("学员:{}, 成绩中等", stu.name); } else { println!("学员:{}, 成绩不合格!!!", stu.name); }}

再增加一个判断性别的函数,用match的方式来判断分支。

fn check_sex(stu: &Student) { match stu.sex { Sex::Boy => println!("学员: {} 是男生", stu.name), Sex::Girl => println!("学员: {} 是女生", stu.name), }}循环

Rust 循环主要有3种方式:

loop 无限循环,自己控制循环退出while 条件循环for 条件循环

下面用3种循环方式分别打印学生信息,学生成绩信息以及学生性别信息。

// loop 循环示例 let mut count = 0; loop { if count == students.len() { break; } display(&students[count]); count += 1; } // while 循环示例 count = 0; while count < students.len() { check_score(&students[count]); count += 1; } // for 循环示例 for stu in students { check_sex(&stu); }

3种循环中,还是 for循环最为见解,这也是我们使用最多的循环方式。

总结

这里可以看出,只要会任何一种编程语言,几乎不需要太多Rust特有的知识,我们也可以用Rust来编写代码。

当然,Rust的优势,比如内存安全和高性能,这里并没有体现。这篇博客的目的是希望能够尽快将Rust用起来,用起来之后,遇到问题解决问题,在用的过程中逐步理解Rust的高阶概念和语法,一步一步成为Rust高手。

附录

完整的示例如下:

#[derive(Debug)]enum Sex { Boy, Girl,}struct Student { name: String, // 姓名 age: u16, // 年龄 sex: Sex, // 性别 score: f32, // 成绩}fn main() { let students: [Student; 2] = [ Student { name: String::from("boy01"), age: 18, sex: Sex::Boy, score: 61.5, }, Student { name: String::from("girl01"), age: 16, sex: Sex::Girl, score: 91.5, }, ]; // loop 循环示例 let mut count = 0; loop { if count == students.len() { break; } display(&students[count]); count += 1; } // while 循环示例 count = 0; while count < students.len() { check_score(&students[count]); count += 1; } // for 循环示例 for stu in students { check_sex(&stu); }}fn display(stu: &Student) { println!( "name: {}, age: {}, sex:{:?}, score: {}", stu.name, stu.age, stu.sex, stu.score );}fn check_score(stu: &Student) { if stu.score > 100.0 { println!("学员:{}, 成绩错误", stu.name); } else if stu.score <= 100.0 && stu.score >= 90.0 { println!("学员:{}, 成绩优秀", stu.name); } else if stu.score < 90.0 && stu.score >= 75.0 { println!("学员:{}, 成绩良好", stu.name); } else if stu.score < 75.0 && stu.score >= 60.0 { println!("学员:{}, 成绩中等", stu.name); } else { println!("学员:{}, 成绩不合格!!!", stu.name); }}fn check_sex(stu: &Student) { match stu.sex { Sex::Boy => println!("学员: {} 是男生", stu.name), Sex::Girl => println!("学员: {} 是女生", stu.name), }}$ cargo run Compiling stu_manager v0.1.0 (/home/wangyubin/projects/rust/stu_manager) Finished dev [unoptimized + debuginfo] target(s) in 0.60s Running `target/debug/stu_manager`name: boy01, age: 18, sex:Boy, score: 61.5name: girl01, age: 16, sex:Girl, score: 91.5学员:boy01, 成绩中等学员:girl01, 成绩优秀学员: boy01 是男生学员: girl01 是女生
本文链接地址:https://www.jiuchutong.com/zhishi/310339.html 转载请保留说明!

上一篇:java门面模式是什么(spring 门面模式)

下一篇:PHP中define定义常量的方法(php中使用什么函数来定义常量)

  • Redmi K40建议升级到MIUI 12.5稳定版吗(红米k40能不能升级miui12.5)

    Redmi K40建议升级到MIUI 12.5稳定版吗(红米k40能不能升级miui12.5)

  • 圣女贞德攻略psp(圣女贞德攻略)

    圣女贞德攻略psp(圣女贞德攻略)

  • vivox70怎么更换主题(vivox70怎么更换壁纸)

    vivox70怎么更换主题(vivox70怎么更换壁纸)

  • 网易云私信怎么知道对方看没看(网易云私信怎么免打扰)

    网易云私信怎么知道对方看没看(网易云私信怎么免打扰)

  • 华为nova7pro支持无线充电功能吗(华为nova7pro支持nfc功能吗)

    华为nova7pro支持无线充电功能吗(华为nova7pro支持nfc功能吗)

  • 苹果11相机夜间模式如何设置(苹果11相机夜间模式前置怎么设置)

    苹果11相机夜间模式如何设置(苹果11相机夜间模式前置怎么设置)

  • 4g内存装win7还是win10(4G内存装win7还是win10)

    4g内存装win7还是win10(4G内存装win7还是win10)

  • 笔记本电池坏了怎么办(笔记本电池坏了有没有更换的必要)

    笔记本电池坏了怎么办(笔记本电池坏了有没有更换的必要)

  • 笔记本不用的时候要拔掉电源吗(笔记本不用的时候一直插着电源好吗)

    笔记本不用的时候要拔掉电源吗(笔记本不用的时候一直插着电源好吗)

  • 拼多多微信付款后找不到订单(拼多多微信付款方式在哪设置)

    拼多多微信付款后找不到订单(拼多多微信付款方式在哪设置)

  • 苹果mini4上市时间(苹果mini4啥时候上市的)

    苹果mini4上市时间(苹果mini4啥时候上市的)

  • 苹果微信有办法美颜吗(苹果微信有办法开美颜视频功能吗)

    苹果微信有办法美颜吗(苹果微信有办法开美颜视频功能吗)

  • 小米手机繁体字怎么取消(小米手机繁体字转换怎么设置的)

    小米手机繁体字怎么取消(小米手机繁体字转换怎么设置的)

  • ipad3是哪一年的(ipad4是哪一年的)

    ipad3是哪一年的(ipad4是哪一年的)

  • iphone小黑点怎么设置(iphone小黑点怎么设置快速截屏)

    iphone小黑点怎么设置(iphone小黑点怎么设置快速截屏)

  • 钉钉群直播和视频会议有什么区别(钉钉群直播和视频会议)

    钉钉群直播和视频会议有什么区别(钉钉群直播和视频会议)

  • 打电话显示外拨已转接来电什么意思(打电话显示外拨已转接来电怎么设置)

    打电话显示外拨已转接来电什么意思(打电话显示外拨已转接来电怎么设置)

  • dp75sdi是第几代(亚马逊dp75sdi是第几代)

    dp75sdi是第几代(亚马逊dp75sdi是第几代)

  • 华为手机如何设置应用使用时间(华为手机如何设置返回键)

    华为手机如何设置应用使用时间(华为手机如何设置返回键)

  • iphone为什么不能提前激活(iphone为什么不能创建id)

    iphone为什么不能提前激活(iphone为什么不能创建id)

  • 滴滴投诉司机能否看到(滴滴投诉司机,司机会立刻知道结果吗)

    滴滴投诉司机能否看到(滴滴投诉司机,司机会立刻知道结果吗)

  • 相片怎么制作视频(相片怎么制作视频音乐)

    相片怎么制作视频(相片怎么制作视频音乐)

  • 魅族新智能冻结3.0s干嘛的(魅族智能冻结3.0怎样关闭)

    魅族新智能冻结3.0s干嘛的(魅族智能冻结3.0怎样关闭)

  • 坦白说不是好友能发吗(坦白说不是好友对方能看见吗)

    坦白说不是好友能发吗(坦白说不是好友对方能看见吗)

  • 华为aum一tl20是什么型号(华为aum一al20是什么型号多少钱)

    华为aum一tl20是什么型号(华为aum一al20是什么型号多少钱)

  • 官方自带YOLOv5的半自动标注方法(yolov5 ios)

    官方自带YOLOv5的半自动标注方法(yolov5 ios)

  • 【YOLOv7】主要改进点详解(yolov4参数设置)

    【YOLOv7】主要改进点详解(yolov4参数设置)

  • Python中if嵌套是什么?(pythonif嵌套语句)

    Python中if嵌套是什么?(pythonif嵌套语句)

  • 增值税附征怎么计算
  • 计算应纳税所得额时 不得扣除支出有哪些
  • 我国增值税征收范围
  • 工会经费余额在借方怎么办
  • 5个点的税点
  • 免税行业可以开什么发票
  • 支票盖财务章盖在哪里
  • 费用怎么分析
  • 收入总额的概念
  • 买二手房没满2年多少税
  • 自然灾害导致的车损可以理赔嘛
  • 一般纳税人取得普票会计分录
  • 工程技术服务费和技术服务费
  • 本地开的住宿费可以退吗
  • 发票认证勾选是一回事吗
  • 所有的固定资产都有残值率吗
  • 每股股份价格
  • 年薪制12个月的计算公式
  • 公司地址变更代办需要多少钱
  • 跨年的发票可以补开吗
  • 计提跌价准备会影响利润吗
  • 盘盈的资产
  • 苹果6手机锁屏
  • 劳务报酬必须要和工资申报吗
  • 爱奇艺以图搜剧不见了
  • win11怎么更改壁纸
  • win11 zen2
  • regsrv.exe - regsrv是什么进程 有什么用
  • win7纯净版系统之家
  • rtp webrtc
  • php 生成随机字符串
  • 无形资产期末余额在哪方
  • 股东无偿投入的土地需要摊销吗
  • 递延收益摊销金额
  • 机票的退票费可以开具发票吗
  • typescript4.1
  • 【深度学习】模型过拟合的原因以及解决办法
  • 电脑找不到应用程序的图标怎么删除
  • 息税前利润为什么不减利息
  • 固定资产包括无形资产吗?
  • 增值税发票超过一年未抵扣
  • 完美ui
  • 尾款忘记支付,交易关闭怎么办
  • 预付账款需要做预算凭证吗
  • mysql基本查询
  • CentOS 7.3上SQL Server vNext CTP 1.2安装教程
  • 总资产增长率的定义
  • 工会费可以发现金吗
  • 暂估入库后发票整单折扣
  • 不用人工
  • 缴纳工会经费的依据
  • 公司股权变更所需资金
  • 融资租出固定资产的账务处理
  • 低值易耗的管理制度
  • 费用先付款后收到发票的会计分录
  • 为什么工程施工图纸不能泄露
  • 连接mysql服务命令
  • sql数据库性能
  • MySQL下载安装视频
  • mysql教程入门
  • mysql 5.7.17 winx64.zip安装配置方法图文教程
  • windows ip地址在哪里设置
  • ie8 开发者工具
  • windows8禁用uac
  • macbookzen
  • vrvprotect.sys
  • 360杀毒恢复区
  • 重装win7系统后桌面没东西
  • winxp开机黑屏只有光标
  • nodejs使用视频教程
  • 浅谈特殊儿童的融合教育论文
  • cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象
  • dw中css规则定义中文
  • 用python做逻辑回归
  • 占位符设置
  • unicode编码实现方案
  • 安卓开发viewpager的用法
  • python class类型
  • jquery 点击按钮
  • 机关工勤人员2022工资套改表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设