Rust從入門到放棄(1)—— hello,world


安裝及環境配置

  • 特點:安全,性能,並發
  • rust源配置
  • RLS安裝
  • cargo
    • rust管理工具,該工具可以愉快方便的管理rust工程
      #!/bin/bash
      mkdir learn
      cd learn
      cargo init	## 該命令會在當前目錄下初始化一個
      		## 目錄下會出現一個Cargo.toml文件,這是Cargo的配置文件
      		## 還有一個src目錄,目錄中包含一個main.rs的初始文件
      cargo run	## 命令會編譯並運行程序
      cargo build	## 編譯工程
      

變量與函數

函數定義 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,
			}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM