文章目录
- Rust初体验
- Cargo工具
- cargo.toml
- Cargo build
- Cargo 常用指令
- 接收一个字符串的输入
- 所有权
- 基本数据类型
Rust初体验
学习一门语言,要先从最简单的"Hollow, World"开始, 对语言基本形态有一个初步的了解。
// fn —— Rust中的函数声明关键字
// main —— Rust的主函数,类似于其他编程语言,main也是Rust的最优先运行的程序
fn main(){
// println! —— 是Rust中的一个宏(micro)
// 用法类似于python, println!("...{}{}...", a, b)——a, b依次对应前边的'{}'
println!("Hollow, World");// 每条语句完整的语句由分号结束
}
以上就是Rust的一个简单程序,其中可以简要看出Rust中的一些基本元素:
- fn: 函数的声明关键字
- main: 主函数,程序的主体
- println!: Rust中的宏
通过以上代码的认识和学习,我们就可以通过编写一个后缀为’.rs’的文件来进行编译执行了。
注意,Rust代码文件以rs为后缀,不要写错了!
接下来就来了解下,如何对Rust代码进行编译吧——当然下面的部分也涉及到Rust项目的创建。
Cargo工具
Cargo是Rust的构建系统和包管理工具:
- 构建代码
- 构建库
- 组织依赖库——自动包含和自动下载
PS:在安装Rust时已经安装了Cargo,大家可以尽情享用!
对于,Cargo而言,常用的指令如下:
- cargo --version : 查看cargo版本,也可以确定cargo是否安装
- cargo new project_name : 在当前目录创建一个默认格式的项目
- src —— 主要存放lib.rs 或者 main.rs
- main.rs : 项目程序主体
- (不会主动创建该文件)lib.rs : 主要是一些自定义的struct,mod等组成的源码
- cargo.toml : cargo工程项目管理的配置文本
- .gitnore : 创建一个默认的初始化git仓库
在进入具体的编译之前,我们还需要了解一下cargo.toml的组成和含义。
cargo.toml
toml : Tom`s Obvious, Minimal Language,是catgo的配置格式,内部包含两个部分:
- [package] : 里边包含以下内容
- name = “Test” : 当前package的名称——也就是project_name
- version = “0.1.0” : 包版本
- authors = ["dave "] : 作者
- edition = “2018” : Rust版本
- [dependencies] : 默认为空白,里边包含需要的依赖——根据需要填写,格式如下:
- eg: rand = “版本号” —— 至于下载,那是编译的时候的事儿了(VS编写时,可根据插件自动编译下载)
实际上,在Rust中,包不叫package,而是crate——大家慢慢熟悉吧!
接下来,我们回到项目的编译吧!
Cargo build
在cargo中,我们允许一系列的指令进行项目的操作,而项目的编译指令为:
- cargo build: 就会对当前目录的项目进行编,同时会在项目的顶层目录里生成一个Cargo.lock文件——该文件是负责追踪项目依赖的准确版本,不要手动修改,导致不必要的错误。
编译后,会产生一个target目录文件,里边包含生成的文件(windows下会生成exe文件)
除了cargo build指令外,cargo还有不少便捷的常用指令。
Cargo 常用指令
- cargo run: 编译加运行项目,相对于build更为方便
- cargo check: 检查代码,保证代码可以被编译——比build快许多。【时常用于检查当前的代码情况】
- cargo build --release : 按照发布方式优化编译——减少了debug信息——简单拿来说,就是为了发布(release)构建程序。【默认为debug方式】
所以只当了这么多,我们该如何编译rs呢?其实,总结起来就是以下步骤:
- 利用cargo在当前目录创建一个project: cargo new project_name
- 编写src下的main.rs,或者其它rs代码文件
- 配置toml中的依赖项
- 在当前目录,调用cargo run —— 执行编译,并运行生成的程序
从上边的两个大步骤,我们就了解了Rust语言的基本形式和Cargo工具下辅助Rust开发的方式,接下来,就需要我们去简单的了解两个程序,来熟悉Rust中的变量声明和常用类型。
接收一个字符串的输入
现在通过一个简单的程序来了解Rust的变量声明:
fn main(){
// let mut 声明一个可变的变量【单独的let默认不可变,但是不等于const常量】
// input_str 变量名
let mut input_str = String::new(); // String字符串,通过new()创建一个空字符串
println!("请输入一行字符串:")
// std : 标准库
// io: 标准库的模块
// stdin: 模块中的模块
// read_line: 读取一行字符串输入
// &:表引用==借用,这里是指传入一个可变引用【默认不可变的引用】
std::io::stdin().read_line(&mut input_str).except("Read_line Error!") // except是当读取失败时,打印这条语句
// read_line(&mut input_str):将读取的内容返回给input_str中,务必使用引用,否则会对变量造成影响——具体请参考Rust中的变量所有权
println!("输入的字符串为: {}", &input_str)
}
通过上面的程序我们可以读取一行的输入数据作为字符串进入到程序中,并保存到指定变量里——但是需要使用引用&。
结合上边的代码,来简单聊一聊Rust中的变量声明:
- let x = 1;
- 这是一个不可变的变量,也就是说此时再执行 => x=4; 是不合法的
- let mut x = 1;
- 这是一个可变的变量,也就是说此时的x可以执行 => x=4;是合法的
- const let x = 2;
- 这是声明一个常量,自然是给定初值后不可修改的——且通常声明在全局中的
知道以上声明规则,也就明白了为什么在声明input_str是要使用mut的格式了。
此外,上边的例子中,涉及到了引用,这个部分的理解是这样的:
- &:起到引用变量的作用,即对变量的值进行引用,参与运算或者赋值,而不取得变量的所有权。
- *:解引用。
所有权
在Rust中,所有权是一个核心概念——具体可参考Rust官网,内容简练。【后期单独说明,这部分先看一下官网】
基本数据类型
- i32, u32, i64, u64, u8, i8 等
- f32, f64
- bool
- 以及字面字符串值等
其它数据类型:
- Vector
- String
- Tuple