鍍金池/ 教程/ Java/ 原生類型
標(biāo)準(zhǔn)輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測試與評測
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯誤處理
VS Code 安裝配置
動態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實(shí)現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫
類型、運(yùn)算符和字符串
類型系統(tǒng)中的幾個常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標(biāo)準(zhǔn)庫示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對象
前期準(zhǔn)備
代碼風(fēng)格
編譯器參數(shù)
基于語義化版本的項(xiàng)目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應(yīng)用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊(duì)列
目錄操作:簡單grep
語句和表達(dá)式
并發(fā)編程
閉包
測試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊(duì)列
Prelude
cargo簡介
控制流(control flow)
數(shù)組、動態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實(shí)戰(zhàn)篇
Rust 是一門系統(tǒng)級編程語言,被設(shè)計(jì)為保證內(nèi)存和線程安全,并防止段錯誤。作為系統(tǒng)級編程語言,它的基本理念是 “零開銷抽象”。理
運(yùn)算符重載
Any和反射
rust數(shù)據(jù)庫操作
輸入輸出流
復(fù)合類型
性能測試

原生類型

像其他現(xiàn)代編程語言一樣,Rust提供了一系列基礎(chǔ)的類型,我們一般稱之為原生類型。其強(qiáng)大的類型系統(tǒng)就是建立在這些原生類型之上的,因此,在寫Rust代碼之前,必須要對Rust的原生類型有一定的了解。

bool

Rust自帶了bool類型,其可能值為true或者false。 我們可以通過這樣的方式去聲明它:

let is_she_love_me = false;
let mut is_he_love_me: bool = true;

當(dāng)然,bool類型被用的最多的地方就是在if表達(dá)式里了。

char

在Rust中,一個char類型表示一個Unicode字符,這也就意味著,在某些語言里代表一個字符(8bit)的char,在Rust里實(shí)際上是四個字節(jié)(32bit)。 同時,我們可以將各種奇怪的非中文字符隨心所欲的賦值給一個char類型。需要注意的是,Rust中我們要用'來表示一個char,如果用"的話你得到的實(shí)際上是一個&'static str

let c = 'x';
let cc = '王';

數(shù)字類型

和其他類C系的語言不一樣,Rust用一種符號+位數(shù)的方式來表示其基本的數(shù)字類型??赡苣懔?xí)慣了int、doublefloat之類的表示法,Rust的表示法需要你稍微適應(yīng)一下。

你可用的符號有 i、f、u

你可用的位數(shù),當(dāng)然了,都是2的n次冪,分別為816、32、64size。

你可以將其組合起來,形成諸如i32,u16等類型。

當(dāng)然了,這樣的組合并不自由,因?yàn)楦↑c(diǎn)類型最少只能用32位來表示,因此只能有f32f64來表示。

自適應(yīng)類型

看完上面你一定會對isizeusize很好奇。這兩個是來干啥的。這兩個嘛,其實(shí)是取決于你的操作系統(tǒng)的位數(shù)。簡單粗暴一點(diǎn)比如64位電腦上就是64位,32位電腦上就是32位,16位……呵呵噠。

但是需要注意的是,你不能因?yàn)槟愕碾娔X是64位的,而強(qiáng)行將它等同于64,也就是說isize != i64,任何情況下你都需要強(qiáng)制轉(zhuǎn)換。

數(shù)組 array

Rust的數(shù)組是被表示為[T;N]。其中N表示數(shù)組大小,并且這個大小一定是個編譯時就能獲得的整數(shù)值,T表示泛型類型,即任意類型。我們可以這么來聲明和使用一個數(shù)組:

let a = [8, 9, 10];
let b: [u8;3] = [8, 6, 5];
print!("{}", a[0]);

和Golang一樣,Rust的數(shù)組中的N(大?。┮彩穷愋偷囊徊糠?,即[u8; 3] != [u8; 4]。這么設(shè)計(jì)是為了更安全和高效的使用內(nèi)存,當(dāng)然了,這會給第一次接觸類似概念的人帶來一點(diǎn)點(diǎn)困難,比如以下代碼。

fn show(arr: [u8;3]) {
    for i in &arr {
        print!("{} ", i);
    }
}

fn main() {
    let a: [u8; 3] = [1, 2, 3];
    show(a);
    let b: [u8; 4] = [1, 2, 3, 4];
    show(b);
}

編譯運(yùn)行它你將獲得一個編譯錯誤:

<anon>:11:10: 11:11 error: mismatched types:
 expected `[u8; 3]`,
    found `[u8; 4]`
(expected an array with a fixed size of 3 elements,
    found one with 4 elements) [E0308]
<anon>:11     show(b);
                   ^
<anon>:11:10: 11:11 help: see the detailed explanation for E0308
error: aborting due to previous error

這是因?yàn)槟銓⒁粋€4長度的數(shù)組賦值給了一個只需要3長度數(shù)組作為參數(shù)的函數(shù)。那么如何寫一個通用的show方法來展現(xiàn)任意長度數(shù)組呢?請看下節(jié)Slice

Slice

Slice從直觀上講,是對一個Array的切片,通過Slice,你能獲取到一個Array的部分或者全部的訪問權(quán)限。和Array不同,Slice是可以動態(tài)的,但是呢,其范圍是不能超過Array的大小,這點(diǎn)和Golang是不一樣的。

一個Slice的表達(dá)式可以為如下: &[T] 或者 &mut [T]。

這里&符號是一個難點(diǎn),我們不妨放開這個符號,簡單的把它看成是Slice的甲魚臀部——規(guī)定。另外,同樣的,Slice也是可以通過下標(biāo)的方式訪問其元素,下標(biāo)也是從0開始的喲。 你可以這么聲明并使用一個Slice

let arr = [1, 2, 3, 4, 5, 6];
let slice_complete = &arr[..]; // 獲取全部元素
let slice_middle = &arr[1..4]; // 獲取中間元素,最后取得的Slice為 [2, 3, 4] 。切片遵循左閉右開原則。
let slice_right = &arr[1..]; // 最后獲得的元素為[2, 3, 4, 5, 6],長度為5。
let slice_left = &arr[..3]; // 最后獲得的元素為[1, 2, 3],長度為3。

怎么樣,了解了吧。 那么接下來我們用Slice來改造一下上面的函數(shù)

fn show(arr: &[u8]) {
    for i in arr {
        print!("{} ", i);
    }
    println!("");
}

fn main() {
    let a: [u8; 3] = [1, 2, 3];
    let slice_a = &a[..];
    show(slice_a);
    let b: [u8; 4] = [1, 2, 3, 4];
    show(&b[..]);
}

輸出

1 2 3
1 2 3 4

動態(tài)數(shù)組 Vec

熟悉C++ STL的同學(xué)可能對C++的vector很熟悉,同樣的,Rust也提供了一個類似的東西。他叫Vec。

在基礎(chǔ)類型里講Vec貌似是不太合適的,但在實(shí)際應(yīng)用中的應(yīng)用比較廣泛,所以說先粗略的介紹一下,在集合類型的章節(jié)會有詳細(xì)講述。

在Rust里,Vec被表示為 Vec<T>, 其中T是一個泛型。

下面介紹幾種典型的Vec的用法:

let mut v1: Vec<i32> = vec![1, 2, 3]; // 通過vec!宏來聲明
let v2 = vec![0; 10]; // 聲明一個初始長度為10的值全為0的動態(tài)數(shù)組
println!("{}", v1[0]); // 通過下標(biāo)來訪問數(shù)組元素

for i in &v1 {
    print!("{}", i); // &Vec<i32> 可以通過 Deref 轉(zhuǎn)換成 &[i32]
}

println!("");

for i in &mut v1 {
    *i = *i+1;
    print!("{}", i); // 可變訪問
}

輸出結(jié)果:

1
123
234

最原生字符串 str

你可以用str來聲明一個字符串,事實(shí)上,Rust中,所有用""包裹起來的都可以稱為&str(注意這個&,這是難點(diǎn),不用管他,不是么?),但是這個類型被單獨(dú)用的情況很少,因此,我們將在下一節(jié)著重介紹字符串類型。

函數(shù)類型 Functions

函數(shù)同樣的是一個類型,這里只給大家普及一些基本的概念,函數(shù)類型涉及到比較高階的應(yīng)用,希望大家能在后面的閉包章節(jié)仔細(xì)參讀

下面是一個小例子

fn foo(x: i32) -> i32 { x+1 }

let x: fn(i32) -> i32 = foo;

assert_eq!(11, x(10));
上一篇:Rc 和 Arc下一篇:Visual Studio