作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何用 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/
我是一名优秀的程序员,十分优秀!