2013年1月8日星期二

Rust中的vector和字符串

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));
}

没有评论:

发表评论