安裝及環境配置
- 特點:安全,性能,並發
- 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,
}
}
}