安装及环境配置
- 特点:安全,性能,并发
- rust源配置
- RLS安装
- cargo
- rust管理工具,该工具可以愉快方便的管理rust工程
#!/bin/bash
mkdir learn
cd learn
cargo init ## 该命令会在当前目录下初始化一个
## 目录下会出现一个Cargo.toml文件,这是Cargo的配置文件
## 还有一个src目录,目录中包含一个main.rs的初始文件
cargo run ## 命令会编译并运行程序
cargo build ## 编译工程
- rust管理工具,该工具可以愉快方便的管理rust工程
变量与函数
函数定义 fn main(){}
fn main(){
let world = "world";
println!("hello, {}!", world);
}
//该例子中可以看出来,变量定义使用关键字 let,字符串格式化中的占位符采用 {}
- let 关键字用于引入一个变量
- 占位符 {},在Rust中比较通用,将变量转化为字符串,这里的变量可以是数值或者字符串。
- 返回值,
->
fn main() {
let x:i32;
let y:i32;
x = 10;
y = 5;
println!("x = {}, y = {}", x, y);
println!("add(x, y) = {}", add(x,y));
}
fn add(x:i32, y:i32) ->i32{
x+y
// return x+y;
}
变量声明
let val:i32 = 1
- 在rust中类型定义采用 var: type的形式
fn foo(_x :&'static str) -> &'static str{
"world"
}
fn main(){
println!("hello, {}!", foo("bar"));
}
静态字符串变量 &'static str
注意:在rust中,
str
是关键字,不能用作变量名
let (x,y) = (5, 'a')
// 类型分别是i32,char
- 默认情况下,Rust中的一切都是不可变的,也就是说变量定义后不可改变其值,下面这段代码编译不会通过。
let x:i32 =10;
x = 6;
// ^^^^^ cannot assign twice to immutable variable
- 如果要改变变量,声明时需要加上
mut
关键字
let mut x:i32 = 10
x = 6
字符串,Rust中存在两种字符串类型,str和String。
- &str: 字符串切片,固定大小的,不可变的UTF-8字节序列。
let x = "hello world!";
let y:&str = "hahahhahahah";
- String对象是可变的,可以用
String::from
初始化该类型
let x = String::from(“Hello, World”);
let y: String = String::from(“Isn’t it a wonderful life?");
{
let mut s1 :&str = "s1 is &str";
let mut s2 :String = String::from("s2 is String");
println!("{}, {}", s1, s2);
// s1 is &str, s2 is String
s1 = "s1 is changed";
s2 = String::from("s2 is changed");
println!("{}, {}", s1, s2);
// s1 is changed, s2 is changed
}
- 数字
- i8 i16 i32 i64
- u8 u16 u32 u64
- isize usize
- f32,f64
- 数组
let x = [1, 2, 3];
let y: [i32; 3] = [4, 5, 6];
- 数组不常使用,rust中vector更为常见
let x = vec![1, 2, 3];
let y: Vec<i32> = [4, 5, 6];
- 元组
- 有序的、不可变的对象列表
let x = (5, 'A');
let y : (i32, char) = (12, 'c');
let v = x.0 // v == 5
let a = y.1 // a == 'c'
- 有序的、不可变的对象列表
Rust中的所有权
所有权
- Rust中,每个变量对绑定到它上的值有所有权。
- Rust中堆上的每个值都有一个所有者(变量)
- 当所有者超出作用域时,该值将被丢弃
// String的长度是可变的,分配在堆中,所以这里的会发生所有权移动。
// 在Rust中,这个过程称之为移动move,即原本x的值移动到了y上,x失效了。
fn main(){
let x = String::from("hello"); // x是"hello"
let y = x; // y是“hello”,这时x已经失效
println!("x is {}, f(x) is {}",x, y); // 会出错,因为x失效了。
}
借用
- 任何借用的有效期都不能超过原始所有者的作用域
- 任何时刻,都能够不可变的借用一个资源许多次
- 任何时刻,都能够可变的借用一个资源一次
方法&关联函数
impl
作为实现结构体方法的关键字,方法的输入参数中第一个是self
。调用采用.
impl
范围内,输入参数没有self
的方法,即为关联函数。调用使用:
- 关联函数经常被用作返回一个结构体新实例的构造函数。下面的例子中,Square即为Rect的关联函数。
- 每个Struct允许多个
impl
块
// 定义一个结构体
struct Rect{
width: i32,
length: i32,
}
// 方法
impl Rect{
fn Area(&self) -> i32{
self.width * self.length
}
}
// 关联函数
impl Rect{
fn Square(w:i32) -> Rect{
Rect{width :w,
length: w,
}
}
}