Rust 有严格的别名规则。但是,如果“我知道自己在做什么”,我可以绕过它们吗?
我正在尝试将一个 C 函数转换为 Rust,该函数通过从输入缓冲区读取并写入目标缓冲区来执行复杂的操作,但它有一个巧妙的优化,允许输入和输出缓冲区相同:
foo(src, dst); // result is written to dst
foo(buf, buf); // legal in C, does the operation in-place
为了这个问题,让我们说它是这样的:
void inplace(char *src, char *dst, int len) {
for(int i=0; i < len-1; i++) {
dst[i] = src[i+1] * 2; // algorithm works even if src == dst
}
}
在 Rust 的安全子集中,我必须有两个几乎复制和粘贴的函数版本fn(&mut)
和fn(&, &mut)
.
有没有办法欺骗 Rust 以获得对同一缓冲区的可变和不可变引用?