Руста имеет строгие правила псевдонимов. Но могу ли я обойти их, если «я знаю, что я делаю»?Как использовать (небезопасное) псевдонимы?
Я пытаюсь преобразовать в Rust функцию C, которая выполняет сложную операцию, считывая из входного буфера и записывая в буфер назначения, но имеет умную оптимизацию, которая позволяет входному и выходному буферам быть одинаковыми:
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)
.
Есть ли способ обмануть ржавчину, чтобы получить как изменяемую, так и неизменную ссылку на тот же буфер?
Разве у вас не будет двух разных функций, если у них есть другая семантика? –
@RobertHarvey Semantic - то же самое: возьмите ввод от первого указателя и напишите вывод ко второму указателю. Есть только важная оптимизация, что буферы ввода и вывода могут быть одинаковыми. – Kornel
Вы можете использовать '* const' и' * mut', но тогда вы потеряете все гарантии безопасности, относящиеся к этим частям памяти. Это не случайно, отсутствие изменчивого сглаживания является центральным для многих гарантий Руста. – delnan