按值传递指针的组件

时间:2015-01-04 18:37:38

标签: rust

我刚刚开始使用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)
}

1 个答案:

答案 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。根据您的代码需要进行调整。