Rust官方指南5.2章节示例疑问:为何dbg!宏不对rect1返回所有权?
解答:Rust中
dbg!为何不会获取rect1的所有权 其实核心原因很简单——dbg!只会处理你传给它的东西的所有权,而这里我们传给它的根本不是rect1本身,只是它的引用。
咱们拆解来看:
首先看dbg!的本质,它的签名大概是这样的(简化版):
fn dbg<T: std::fmt::Debug>(value: T) -> T
意思就是:接收一个实现了Debug trait的类型T的所有权,然后返回这个T的所有权。所以它的行为完全由你传入的参数类型决定。
第一个场景:dbg!(30 * scale)
这里30 * scale计算后得到的是一个u32类型的临时值,我们把这个值的所有权直接传给了dbg!。dbg!打印完这个值后,又把它的所有权返回给了width字段——所以最终width拿到的和不用dbg!时完全一样的值,没有任何问题。
第二个场景:dbg!(&rect1)
这里我们特意传入的是&rect1,也就是Rectangle类型的引用。此时dbg!的泛型参数T就变成了&Rectangle,它接收的是这个引用的所有权,打印完引用指向的内容后,又把这个引用的所有权返回(虽然我们没接收这个返回值,但就算接收也只是拿到引用而已)。
而原结构体rect1的所有权,从始至终都在main函数里——因为我们从来没把rect1本身传给dbg!,只是传了个指向它的"指针"而已。dbg!根本碰不到rect1的所有权,自然也就不会把它返回或者夺走。
再结合代码理解就更清晰了:
#[derive(Debug)] struct Rectangle { width: u32, height: u32, } fn main() { let scale = 2; let rect1 = Rectangle { width: dbg!(30 * scale), // 传值:dbg!拿临时u32的所有权,用完返回给width height: 50, }; dbg!(&rect1); // 传引用:dbg!拿引用的所有权,用完返回,rect1本体所有权不动 }
总结一下:
- 如果你不想让某个变量失去所有权,就传它的引用给
dbg!; - 如果你传的是变量本身(值),那
dbg!就会接收它的所有权,再返回给你; - 例子里
rect1没被夺走所有权,只是因为我们从一开始就没把它的所有权交出去~
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

