繁体   English   中英

Rust 书籍示例:dbg! 归还所有权?

[英]Rust Book Example: Does dbg! return ownership or not?

我是 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); }

我们可以把dbg! 围绕表达式 30 * scale and,因为 dbg! 返回表达式值的所有权,宽度字段将获得与没有 dbg 相同的值! 打电话给那里。 我们不想要dbg! 取得 rect1 的所有权,因此我们在下一次调用中使用对 rect1 的引用。

该指南指出dbg! 返回宽度表达式值的所有权,然后在它说我们不想要dbg! 取得rect1的所有权,所以我们使用参考。 为什么不dbg! 返回rect1的所有权?

关键是dbg! 获取所有权,然后其作为评估的值返回。 它就像这个函数一样工作:

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

(真正的实现稍微复杂一点,因为它使用文件行列信息、精确评估的表达式,并且可以在临时生命周期中正常工作)

也就是说,该值被移入dbg! , 但随后又从dbg! 进入您分配给它的任何绑定。

因此,在第一种情况下, dbg! 分配给 struct 字段,因此该字段将等于30 * scale 另一方面,第二种情况也可以这样写:

let rect1 = dbg!(rect1);

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

在第二种情况下,它实际上拥有传递给它的内容的所有权,即rect1的引用,而不是rect1的引用,然后它返回,然后立即丢弃丢弃它,因为你没有检索它(即你没有做类似于let ref_to_rect1 = dbg!(&rect1); )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM