rust - 按值传递指针的组件

标签 rust

我刚刚开始使用 Rust,所以我的一些概念可能是错误的。如果是这种情况,我将不胜感激。

我正在关注 lifetimes guide并尝试一些示例。我稍微修改了矩形示例。

我更改了 compute_distance函数接受 Point按第一个参数中的值。 然后我删除了 &之前 on_the_stack.origin在调用 compute_distance .

这给了我以下错误:

cannot move out of dereference of &-pointer

如果我改为添加 &on_the_stack.origin 之前打电话并接受Pointcompute_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 必须将 Rectanglepart 的所有权赋予该方法,但是 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/

相关文章:

rust - 如何为 Clap Args 使用内部库枚举

rust - "p: &' 和 i3 2"and "p : &'static i32" lifetime in Rust? 之间的区别

rust - Rust,在闭包内创建一个闭包,避免 “closure may outlive the current function”

rust - 有没有一种方法来检查结构体具有字段并检查其类型?

rust - 迭代器的 next 返回 Some(&1)。为什么?

arrays - 如何将函数指针存储在数组中?

stream - 在多个闭包中表达变量对的生命周期

rust - 在 Rust 中统一分配是什么意思?

rust - 为什么 impl trait 不能用于返回多个/条件类型?

rust - cargo 树输出末尾的星号/星号 (*) 代表什么?