今天主要會講的部分有
Slice類型通常翻譯為切片,它表示從某個包含多個元素的容器中取得局部數據,這個過程稱為切片操作。不同語言對切片的支持有所不同,比如有些語言只允許取得連續的局部元素,而有些語言可以取得離散元素,甚至有些語言可以對hash結構進行切片操作。
Rust也支持Slice操作,Rust中的切片操作只允許獲取一段連續的局部數據,切片操作獲取到的數據稱為切片數據。
可以想像成開了一個小視窗來查看原本的資料,
slice的操作主要如下
s[n1..n2]
:獲取s中index=n1到index=n2(不包括n2)之間的所有元素s[n1..]
:獲取s中index=n1到最後一個元素之間的所有元素s[..n2]
:獲取s中第一個元素到index=n2(不包括n2)之間的所有元素s[..]
:獲取s中所有元素但由於切片數據的長度無法在編譯期間得到確認,且編譯器是不允許使用大小不定的數據類型的,因此無法直接去使用切片數據。
所以在Rust中幾乎總是使用切片數據的引用。切片數據的引用對應的數據類型描述為&[T]
或&mut [T]
,前者不可通過Slice引用來修改源數據,後者可修改源數據。
範例如下
let points = [6, 10, 12, 19, 23, 45];
let slice1 = &points[0..3]; //不可變
let slice2 = &mut points[4..6]; //可變
此外,因為 slice 本身就是引用,所以可以直接將array的引用當成slice來使用。即&arr
和&mut arr
當作不可變slice和可變slice來使用。
切片本身也有型別,切片的型別就是它所參照到的資料的型別.
範例如下
fn calc_point(points: &[u16]) -> u16 {
points.iter().sum()
}
let points = [6, 10, 12, 19, 23, 45];
let group1 = &points[0..2];
let group2 = &points[2..];
println!("{}", calc_point(group1));
println!("{}", calc_point(group2));
可以看到 &[u16]
表示傳進來的參數是個陣列型的切片,前面的 &
表示它是一種參照型別,裡面的 u16
則是表示原先陣列裡的型別
底下這裡是一些 slice 常見的 attribute
s.swap(1,3)
在 Rust 裡可以使用 struct
關鍵字來定義一個 Sturct:
struct Order {
bid: u8,
ask: u8,
is_buy: bool,
}
定義完之後,就可以用這個sturct來建立東西
let order = Order {
bid: 34,
ask: 35,
is_buy: true,
};
透過 .
就可以取用設定的值了
println!("{}", order.bid);
println!("{}", order.ask);
println!("{}", order.is_buy);
接著,和其他語言比較不一樣的地方在於定義方法不會寫在類別裡,而是透過透過 impl
關鍵字寫在別的地方.
如下
let order = Order {
bid: 34,
ask: 35,
is_buy: true,
};
impl Order {
fn cal_spread(&self) {
println!("Hello, my name is {}", self.ask - self.bid);
}
fn set_dir(&mut self, is_buy: bool) { // 這樣才可以修改值
self.is_buy = is_buy;
}
}
今天就先講到這,明天會繼續介紹 Lifttime 跟 Trait,這幾天的東西會比較基本,但Rust本身限制較多,所以這些基本觀念要先掌握,才不會之後瘋狂的在處理編譯錯誤