gpt4 book ai didi

pointers - 我如何在 Rust 中编写这个 C 函数?

转载 作者:行者123 更新时间:2023-11-29 08:19:21 24 4
gpt4 key购买 nike

我如何用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com