我有一个可变引用向量:
struct T;
let mut mut_vec: Vec<&mut T> = vec![];
Run Code Online (Sandbox Code Playgroud)
我如何将它(的副本)传递给一个采用不可变引用向量的函数?
fn cool_func(mut immut_vec: Vec<&T>) {}
Run Code Online (Sandbox Code Playgroud)
您可以取消引用并重新借用可变引用,然后将它们添加到新的Vec:
fn main() {
let mut st = String::new();
let mut_vec = vec![&mut st];
let immut_vec = mut_vec.into_iter().map(|x| &*x).collect();
cool_func(immut_vec);
}
fn cool_func(_: Vec<&String>) {}
Run Code Online (Sandbox Code Playgroud)
但是请注意,这会消耗原始数据Vec- 您无法真正解决这个问题,就好像原始数据Vec仍然存在一样,您将同时拥有对同一条数据的可变和不可变引用,这是编译器不允许的。
如果您需要实际转换,请参阅Joe Clay 的回答。但是,您可能一开始就不需要转换!
不要更改参数,而是更改函数,使其接受可变和不可变引用。这里我们使用Borrow对两者进行抽象:
use std::borrow::Borrow;
fn main() {
let mut st = String::new();
let mut_vec = vec![&mut st];
cool_func(mut_vec);
let immut_vec = vec![&st];
cool_func(immut_vec);
}
fn cool_func<S>(_: Vec<S>)
where
S: Borrow<String>,
{
}
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |