Pointers 我将如何用Rust编写这个C函数?

Pointers 我将如何用Rust编写这个C函数?,pointers,rust,Pointers,Rust,我将如何在Rust中编写下面的函数?是否有安全写入replace()的方法,还是操作本身就不安全列表不必是数组,向量也可以。我感兴趣的是替换手术 void替换(int*list[],int a,int b){ *列表[a]=*列表[b]; } 我想要以下行为: int a = 1; int b = 2; int *list[] = { &a, &a, &b, &b }; *list[0] = 3; // list has pointers to

我将如何在Rust中编写下面的函数?是否有安全写入
replace()
的方法,还是操作本身就不安全<代码>列表不必是数组,向量也可以。我感兴趣的是替换手术

void替换(int*list[],int a,int b){
*列表[a]=*列表[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]
修改问题的答案 请确保对同一项具有多个可变引用(别名)。这意味着您永远无法运行与第三行相同的功能:

fn main() {
    let mut a = 1;
    let vals = &[&mut a, &mut a];
}
这在以下情况下失败:

cannot borrow `a` as mutable more than once at a time

使用Rc和RefCell怎么样

不允许我们改变值:

不可变值上的引用计数指针类型

(强调矿山)

不允许多个并发借用:

如果当前借用了该值,则会出现恐慌

原问题的答案 基本上是一样的。我选择了一个
u8
因为它更容易输入。:-)

fn替换(v:&mut[&mut u8],a:usize,b:usize){
*v[a]=*v[b]
}
fn main(){
设mut-vals=vec![1,2,3,4];
{
让mut val_refs:Vec=vals.iter_mut().collect();
替换(&mut val_refs,0,3);
}
println!(“{:?}”,VAL);
}
()


Rust会执行边界检查,因此如果您使用大于切片的索引调用,程序将死机,并且不会导致内存损坏。

@Duplicator抱歉,这是合理的。@Shepmaster我已使用所需的行为更新了描述。抱歉,我不清楚。为什么要对同一个变量有多个可变引用?在Rust中不允许这样做,但如果我们以不同的方式看待这个问题,您试图用可变别名解决的问题在Rust中可能是可以解决的。@Shepmaster说我有一个类似HashMap的类型,我希望强制此结构的一个属性,以便每个映射键都包含对键所属集合的引用。现在,我想实现一个合并函数,它将合并两个集合。但是我想更新这两个集合的所有键以指向新的合并的一个。也许我误解了,但是“每个映射键都包含对集合的引用”-HashMap不是这样做的吗?在键和值之间保持一种关系?我认为它不适用于这个:int a=1;int b=2;int*list[]={&a,&a,&b,&b};使用Rc和RefCell怎么样?好的,那么操作本身就是不安全的。
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);
}