我刚刚开始使用Rust,所以我的一些概念可能是错误的。如果是这种情况,我真的很感激修正。
我正在关注lifetimes guide并尝试了一些示例。我稍微修改了矩形示例。
我在第一个参数中将compute_distance
函数更改为接受Point
的值。
然后,我在&
的调用中on_the_stack.origin
之前删除了compute_distance
。
这给了我以下错误:
无法移出
的取消引用&
- 指针
如果我在&
调用之前添加on_the_stack.origin
,并在Point
函数中通过引用接受compute_distance
,那么它可以正常运行。
第二种方法对我有意义,但为什么我的原始方法会抛出错误?
use std::num::Float;
struct Point {
x : f64,
y : f64
}
struct Size {w: f64, h: f64}
struct Rectangle {origin: Point, size: Size}
#[cfg(not(test))]
fn main() {
let on_the_stack = &Rectangle{origin: Point {x: 1.0, y: 2.0},
size: Size {w: 3.0, h: 4.0}};
let on_the_heap = box Rectangle {origin: Point {x: 5.0, y: 6.0},
size: Size {w: 3.0, h: 4.0}};
println!("Distance: {}", compute_distance(on_the_stack.origin,&on_the_heap.origin));
}
fn compute_distance ( p1:Point,p2:&Point) -> f64 {
let x_d = p1.x - p2.x;
let y_d = p1.y - p2.y;
Float::sqrt(x_d * x_d + y_d * y_d)
}
答案 0 :(得分:2)
正如您所说,您更改的compute_distance
想要值作为第一个参数。这意味着该函数将取得参数的所有权。
但是,您试图传递一小块结构(origin
中嵌入了Rectangle
)。要做到这一点,Rust必须将Rectangle
的 part 的所有权授予该方法,但确切地说将Rectangle
留在哪个州?一个非常破碎的,所以Rust阻止你这样做。是的,你没有用脚射击自己!
“但等等”,你说,“如果函数获得origin
的副本,那就太酷了。”作为一个人,你可以认识到这一点并告诉编译器它“非常酷”:
#[deriving(Copy)]
struct Point { /* ... */ }
现在Rust知道如果愿意的话,可以安全地制作Point
的逐位副本。好哇!
“但是等待”,你说,“如果不很酷,那么做一点点复制怎么办?我的结构需要更多的爱而不是像对待一样一袋包!“同样,作为一个聪明的人,你可以表达:
#[deriving(Clone)]
struct Point { /* ... */ }
// later...
on_the_stack.origin.clone()
现在,您可以进行显式调用(clone()
)以获取该选项的语义副本。因为这可能是一项昂贵的操作,编译器不会为你做这件事。
关于deriving
在我写这个答案时,deriving
正在转换为derive
。根据您的代码需要进行调整。