我刚刚开始使用 Rust,所以我的一些概念可能是错误的。如果是这种情况,我将不胜感激。
我正在关注 lifetimes guide并尝试一些示例。我稍微修改了矩形示例。
我更改了 compute_distance
函数接受 Point
按第一个参数中的值。
然后我删除了 &
之前 on_the_stack.origin
在调用 compute_distance
.
这给了我以下错误:
cannot move out of dereference of
&
-pointer
如果我改为添加 &
在 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)
}
最佳答案
如您所说,您更改后的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
正在过渡到 derive
。根据您的代码需要进行调整。
关于rust - 按值传递指针的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768956/