Rust中Vec的push方法是否会获取参数的所有权?
为什么调用Vec::push后原变量还能继续使用?
你对Vec::push方法签名的理解是对的——它的参数确实是T类型,按设计会接收参数的所有权。但你代码里的特殊情况,核心原因是你的变量类型实现了Copy trait。
具体拆解:
- 你代码中的
x是i32类型,Rust里所有整数、浮点数、布尔值等基础类型都默认实现了Copytrait。当调用v.push(x)时,Rust会自动复制x的数值,把这个副本传递给push方法,原变量x的所有权完全没被转移,所以之后你依然可以修改、使用它。 - 如果换成一个没有实现
Copy的类型,比如String,那调用push后原变量就会失去所有权,再使用就会触发编译错误。比如这段代码:
let mut v = vec![]; let x = String::from("test"); v.push(x); // println!("{}", x); // 编译报错:value borrowed here after move
简单总结:
- 当参数类型实现
Copy时,传递T会自动复制值,原变量不受影响; - 当参数类型未实现
Copy时,传递T会转移所有权,原变量无法再使用。
内容的提问来源于stack exchange,提问作者Kami SM
相关产品推荐
相关产品推荐

