[英]Why does the multithreaded web server example from the Rust book not compile?
[英]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.