rust eclipse 书示例:dbg!是否返回所有权?

zpgglvta  于 2022-12-26  发布在  Eclipse
关注(0)|答案(2)|浏览(164)

在Rust官方指南第5.2章:

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let scale = 2;
    let rect1 = Rectangle {
        width: dbg!(30 * scale),
        height: 50,
    };

    dbg!(&rect1);
}

我们可以在表达式30 * scale周围加上dbg!,因为dbg!返回表达式值的所有权,所以width字段将获得相同的值,就好像我们没有在那里调用dbg!一样,我们不希望dbg!获得rect1的所有权,所以我们在下一次调用中使用对rect1的引用。
指南指出dbg!返回宽度表达式值的所有权,然后紧接着它说我们不希望dbg!获得rect1的所有权,所以我们使用了一个引用。为什么dbg!不返回rect1的所有权?

yks3o0rb

yks3o0rb1#

关键是dbg! * 获取 * 所有权,然后将其作为求值所得的值 * 返回 *。

fn dbg<T: Debug>(val: T) -> T {
    // some debug printing of `val`
    val
}

(The真实的的实现要稍微复杂一些,因为它使用文件-行-列信息、精确计算的表达式,并且可以正确处理临时对象的生存期。)
也就是说,该值被移动到dbg!中,但随后又从dbg!移动到您分配给它的任何绑定中。
因此,在第一种情况下,dbg!的值被赋给了struct字段,因此该字段将等于30 * scale。另一方面,第二种情况也可以这样写:

let rect1 = dbg!(rect1);

也就是说,将值移出rect1,打印它,然后将它存储到新绑定(也称为rect1)中。

uqdfh47h

uqdfh47h2#

在第二种情况下,它实际上获得了传递给它的内容的所有权,也就是说,* 对rect1的引用 *,而不是rect1,然后它返回rect1,然后立即丢弃它,因为您没有检索它(即,您没有执行类似let ref_to_rect1 = dbg!(&rect1);的操作)。

相关问题