我如何用 Rust 编写下面的函数?有没有一种方法可以安全地编写 replace()
或者该操作本身就不安全? list
不必是数组,向量也可以。这是我感兴趣的替换操作。
void replace(int *list[], int a, int b) {
*list[a] = *list[b];
}
我想要以下行为:
int a = 1;
int b = 2;
int *list[] = { &a, &a, &b, &b };
*list[0] = 3; // list has pointers to values: [3, 3, 2, 2]
replace(list, 2, 0); // list has pointers to values: [3, 3, 3, 3]
*list[0] = 4; // list has pointers to values: [4, 4, 4, 4]
最佳答案
修改问题的答案
使用rust does not allow您对同一项目有多个可变引用(别名)。这意味着您永远无法运行相当于第三行的代码:
fn main() {
let mut a = 1;
let vals = &[&mut a, &mut a];
}
这失败了:
cannot borrow `a` as mutable more than once at a time
What about using Rc and RefCell?
Rc
不允许我们改变值:
A reference-counted pointer type over an immutable value.
(强调我的)
RefCell::borrow_mut
不允许多个并发借用:
Panics if the value is currently borrowed.
原始问题的答案
基本上是一样的。我选择了 u8
因为它更容易打字。 :-)
fn replace(v: &mut [&mut u8], a: usize, b: usize) {
*v[a] = *v[b]
}
fn main() {
let mut vals = vec![1,2,3,4];
{
let mut val_refs: Vec<&mut u8> = vals.iter_mut().collect();
replace(&mut val_refs, 0, 3);
}
println!("{:?}", vals);
}
( playpen link )
Rust 确实会进行边界检查,因此如果您使用大于切片的索引进行调用,程序将崩溃并且您不会出现内存损坏。
关于pointers - 我如何在 Rust 中编写这个 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786758/