Cargo是什么?
Cargo
是rust的构建工具、包管理器;
crate是什么?
crate类似npm package或ruby gem,类似依赖包
的意思;
rust和动态语言对比
rust库
std io标准库
let声明变量
let apples = 5; // 不可变 |
整型
长度 | 有符号 | 无符号 |
---|---|---|
8-bit | i8 | U8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | U64 |
128-bit | i128 | u128 |
arch(由CPU架构决定大小 x86为32位,x64为64位) | isize | Usize |
数字字面值 | 例子 |
---|---|
Decimal(十进制) | 98_222 |
Hex(十六进制) | 0xff |
Octal(八进制) | 0o77 |
Binary(二进制) | 0b1111_0000 |
Byte(单字节字符)(仅限于u8) | b’A’ |
浮点型
Rust的浮点数类型是 f32
和f64
,分别占32位和64位,默认类型是f64
浮点数采用 IEEE-754 标准表示。f32
是单精度浮点数,f64
是双精度浮点数。
布尔型
Rust的布尔类型有两个值: true
和false
,使用 bool
表示;
字符类型
Rust的 char
类型是语言中原生的字符类型;使用 ''
声明字符类型,字符串使用 ""
声明;
复合类型
Rust有两个原生复合类型: 元组(tuple)和数组 (array)
元组 Tuple
fn main() { |
数组 Array
let a: [i32; 5] = [1, 2, 3, 4, 5]; |
fn、main
fn
用于声明函数,main
函数为程序入口;
在函数声明中,必须声明每个参数的类型。
fn main(){ |
语句和表达式的区别,语句需要;
修饰,表达式不需要。
fn main() { |
练习-斐波那契数列
fn main() { |
注释
//这是第一行注释 |
文档注释
///这是第一行注释 |
if表达式
fn main(){ |
在let语句中使用if else
提示: if else的分支类型要匹配,否则会提示编译错误
fn main(){ |
loop循环
fn main() { |
while循环
fn main(){ |
for循环
fn main(){ |
match 分支
用于分支判断,类似其他语言的switch(condition){}
let guess: u32 = match guess.trim().parse() { |
const 常量
常量和其他语言类似,约定大写+_
命名
所有权(ownership)
堆: 先进先出;
栈: 先进后出;
所有权规则
rust 中的每一个值都有一个
owner
;值在任一时刻有且只有一个
owner
;当
owner
离开作用域,这个值将被丢弃;
变量作用域
{ // s 在这里无效,它尚未声明 |
String 类型
如果你在其他语言中听说过术语 浅拷贝(shallow copy)和 深拷贝(deep copy),那么拷贝指针、长度和容量而不拷贝数据可能听起来像浅拷贝。不过因为 Rust 同时使第一个变量无效了,这个操作被称为 移动(move),而不是叫做浅拷贝。上面的例子可以解读为
s1
被 移动 到了s2
中。
let s1 = String::from("hello"); |
Copy
类型
所有整数类型,比如
u32
。布尔类型,
bool
,它的值是true
和false
。所有浮点数类型,比如
f64
。字符类型,
char
。元组,当且仅当其包含的类型也都实现
Copy
的时候。比如,(i32, i32)
实现了Copy
,但(i32, String)
就没有。
引用(References)与借用
&
语法让我们创建一个指向的引用,但并不拥有。
fn main() { |
& mut
可变引用,可修改应用的值;
限制:
在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
引用必须总是有效的。
数据竞争(data race)类似于竞态条件,它可由这三个行为造成:
两个或更多指针同时访问同一数据。
至少有一个指针被用来写入数据。
没有同步数据访问的机制。
fn main() { |
Slice类型
slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引用,所以它没有所有权。