Rust中的vector和字符串
根据Rust 0.6的tutorial整理。一个vector就是一段相邻的内存,其中包含零个或者多个同一类型的值。和Rust的其他类型一样,vectors可以存储于栈,本地堆,和交换堆上。vectors的borrowed pointers也称为“slices”。
// A fixed-size stack vector let stack_crayons: [Crayon * 3] = [Almond, AntiqueBrass, Apricot]; // A borrowed pointer to stack allocated vector let stack_crayons: &[Crayon] = &[Aquamarine, Asparagus, AtomicTangerine]; // A local heap (managed) vector of crayons let local_crayons: @[Crayon] = @[BananaMania, Beaver, Bittersweet]; // An exchange heap (owned) vector of crayons let exchange_crayons: ~[Crayon] = ~[Black, BlizzardBlue, Blue];运算符 + 作用于vector类型时表示连接。
let my_crayons = ~[Almond, AntiqueBrass, Apricot]; let your_crayons = ~[BananaMania, Beaver, Bittersweet]; // Add two vectors to create a new one let our_crayons = my_crayons + your_crayons; // += will append to a vector, provided it lives in a mutable slot let mut my_crayons = my_crayons; my_crayons += your_crayons;
注意: 上面的例子中使用的是owned vectors。一些对slices和stack vectors的操作还没有很好地实现。Owned vectors通常是最可用的。方括号表示对vector进行索引:
let crayons: [Crayon * 3] = [BananaMania, Beaver, Bittersweet]; match crayons[0] { Bittersweet => draw_scene(crayons[0]), _ => () }vector的元素继承vector的可变性,因此,如果vector是不可变的,那么元素也不能重新赋值。
let crayons: ~[Crayon] = ~[BananaMania, Beaver, Bittersweet]; crayons[0] = Apricot; // ERROR: Can't assign to immutable vector将其转移至可变变量,就可以对元素赋值。
let crayons: ~[Crayon] = ~[BananaMania, Beaver, Bittersweet]; // Put the vector into a mutable slot let mut mutable_crayons = move crayons; // Now it's mutable to the bone mutable_crayons[0] = Apricot;这个简单的例子展示了Rust中数据结构的双模式:冻结和解冻。
字符串被实现为以u8为元素的vector,虽然它们有明确的类型(str)。字符串基本上支持和vectors相同的分配方式,不过没有明确存储标识的字符串(例如,"foo")和相应的vector([foo])的处理方式不同。Plain vectors是栈上分配的大小固定的vectors,plain strings是指向只读内存的region pointers(borrowed pointers)。所有的字符串都是不可变的。
// A plain string is a slice to read-only (static) memory let stack_crayons: &str = "Almond, AntiqueBrass, Apricot"; // The same thing, but with the `&` let stack_crayons: &str = &"Aquamarine, Asparagus, AtomicTangerine"; // A local heap (managed) string let local_crayons: @str = @"BananaMania, Beaver, Bittersweet"; // An exchange heap (owned) string let exchange_crayons: ~str = ~"Black, BlizzardBlue, Blue";Vectors和字符串支持许多有用的方法,定义在模块core::vec和core::str中。下面是一些例子:
let crayons = [Almond, AntiqueBrass, Apricot]; // Check the length of the vector assert crayons.len() == 3; assert !crayons.is_empty(); // Iterate over a vector, obtaining a pointer to each element for crayons.each |crayon| { let delicious_crayon_wax = unwrap_crayon(*crayon); eat_crayon_wax(delicious_crayon_wax); } // Map vector elements let crayon_names = crayons.map(|v| crayon_to_str(*v)); let favorite_crayon_name = crayon_names[0]; // Remove whitespace from before and after the string let new_favorite_crayon_name = favorite_crayon_name.trim(); if favorite_crayon_name.len() > 5 { // Create a substring println(favorite_crayon_name.substr(0, 5)); }
没有评论:
发表评论