let mut data = [1, 2];
data.fill(data[0]);
}
? С моей точки зрения сначала заимствуется data при вычислении data[0], но после того, как получено значение data[0], data уже свободен и можно вызывать data.fill. Но компилятор так не считает...
Это в исходнике такая последовательность, при работе сначала берётся data[0], а потом только вызывается data.fill. Это ответ и на замечание @Dzhegash
Каком исходнике? Ничего не понял. Оператор . (точка) имеет наивысший приоритет, сначала выполняется он и забирает &mut self, после этого пока .fill() не освободит эту ссылку, нельзя трогать data
let first = data[0]; data.fill(first);
Вопрос был не как обойти, а почему. Я сам и ответил: <[i32]>::fill(&mut data, data[0]); так видно в каком порядке заимствуется data )
Ну пока нельзя, причины думаю нет, но проблема небольшая.
Да и потом нельзя будет. &mut self живёт до конца функции
Потому что усложняло анализ заимствований и не входило в nll, только недавно была какая-никакая возможность, сейчас точно нет.
data[0] - копирование, если ты об этом
Обсуждают сегодня