【问题标题】:Passing a component of a pointer by value按值传递指针的组件
【发布时间】:2015-01-04 18:37:38
【问题描述】:

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

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

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

这给了我以下错误:

无法脱离 &-pointer 的取消引用

如果我改为在on_the_stack.origin 调用之前添加&,并在compute_distance 函数中通过引用接受Point,它可以顺利工作。

第二种方法对我来说很有意义,但为什么我原来的方法会抛出错误?

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.12 文档。请注意,为了准备 1.0 alpha/beta/release,Rust 正在迅速变化。建议跟踪每晚构建(和文档)。
  • 哇哦,你是对的。 nightly docs 上的链接似乎完全不同。感谢您的提示!

标签: rust


【解决方案1】:

正如您所说,您更改后的 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的注释

当我写下这个答案时,deriving 正在过渡到derive。根据您的代码的需要进行调整。

【讨论】:

  • 哈哈,非常感谢您的回答!我学到了一个目前不在指南中的新功能!
  • Copy 曾经由编译器在满足特定条件的类型上自动实现。现在不再是这种情况了,这就是为什么现在必须写#[deriving(Copy)]
猜你喜欢
  • 2014-04-07
  • 2016-12-25
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多