其实rust 的所有权机制就是为了避免对象的并发修改,造成冲突。最好解决冲突的方式就是避免冲突的发生,从机制上避免冲突。
在之前rust 入门的文章里面我用手机举例子,你拥有这个手机的所有权,那么就可以去使用和修改手机的配置。下面结合内存布局再来聊聊所有权,先看一段代码,查找数据元素。
fn main() { let data = vec![11, 22, 33, 44]; let v = 33; if let Some(pos) = find_pos(data, v) { println!("Found {} at {}", v, pos); }}fn find_pos(data: Vec, v: u32) -> Option { for (pos, item) in data.iter().enumerate() { if *item == v { return Some(pos); } } None}
代码非常简单,我就不解释了。在main函数中data 拥有vec 的所有权,如下
但调用find_pos 后,所有权就转移到函数里面的本地变量data里面了。
那么原来的main里面的data 就失效了,所有权的特点就是:一个值在同一个时刻只能有一个所有权,当所有权离开作用域,值就会被丢弃。
在上面代码最后一行加一个变量打印
fn main() { let data = vec![11, 22, 33, 44]; let v = 33; if let Some(pos) = find_pos(data, v) { println!("Found {} at {}", v, pos); } println!("data: {:?}", data); // error}
就会报错,解释的也非常清楚,在调用 find_pos 的时候,vec的所有权发生了转移。
为了解决这个问题,才有了借用和copy trait。这个就是后话了。总之,所有权让我们对变量的修改更加安全了,相比其他编程语言,从机制上保证内存安全。
留言与评论(共有 0 条评论) “” |