Rust中无需可变变量,从Vec<T>和T创建新Vec<T>的方法
解决方案
Rust标准库提供了几种不用可变变量就能完成这个需求的方式,无需手动实现:
方法1:利用迭代器链(可选择保留原向量所有权)
如果不需要保留原向量a的所有权,直接把a转成迭代器,再和单个元素的迭代器链接后收集成新向量即可:
let a: Vec<i32> = vec![1, 2, 3]; let b: i32 = 4; let c: Vec<i32> = a.into_iter().chain(std::iter::once(b)).collect();
要是还想继续使用a,就用iter().copied()(适用于实现Copy的类型)或者iter().cloned()(适用于实现Clone的类型)来复制元素:
let a: Vec<i32> = vec![1, 2, 3]; let b: i32 = 4; // T实现Copy时用copied let c: Vec<i32> = a.iter().copied().chain(std::iter::once(b)).collect(); // T实现Clone时用cloned let c: Vec<i32> = a.iter().cloned().chain(std::iter::once(b)).collect();
方法2:使用vec![]宏的扩展语法(Rust 1.55+)
从Rust 1.55版本开始,vec!宏支持用..扩展现有向量的元素,写法更简洁:
let a: Vec<i32> = vec![1, 2, 3]; let b: i32 = 4; let c: Vec<i32> = vec![..a, b];
这个语法会把a的元素所有权转移到新向量,之后a就无法再使用;如果要保留a的所有权,先克隆a再扩展即可:
let a: Vec<i32> = vec![1, 2, 3]; let b: i32 = 4; let c: Vec<i32> = vec![..a.clone(), b];
这些方法都属于标准库范畴,全程不需要使用可变变量,也不用自己写追加逻辑。
内容的提问来源于stack exchange,提问作者0x1a4
相关产品推荐
相关产品推荐

