在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
的所有权?
2条答案
按热度按时间yks3o0rb1#
关键是
dbg!
* 获取 * 所有权,然后将其作为求值所得的值 * 返回 *。(The真实的的实现要稍微复杂一些,因为它使用文件-行-列信息、精确计算的表达式,并且可以正确处理临时对象的生存期。)
也就是说,该值被移动到
dbg!
中,但随后又从dbg!
移动到您分配给它的任何绑定中。因此,在第一种情况下,
dbg!
的值被赋给了struct字段,因此该字段将等于30 * scale
。另一方面,第二种情况也可以这样写:也就是说,将值移出
rect1
,打印它,然后将它存储到新绑定(也称为rect1
)中。uqdfh47h2#
在第二种情况下,它实际上获得了传递给它的内容的所有权,也就是说,* 对
rect1
的引用 *,而不是rect1
,然后它返回rect1
,然后立即丢弃它,因为您没有检索它(即,您没有执行类似let ref_to_rect1 = dbg!(&rect1);
的操作)。