Вот сокращенная версия вашего кода:
struct NonCopy;
fn main() {
// OK
let tuple = (Some(NonCopy), Some(NonCopy));
if let (Some(_x), Some(_y)) = tuple {}
// OK
if let [Some(_x), Some(_y)] = [Some(NonCopy), Some(NonCopy)] {}
// Fails
let array = [Some(NonCopy), Some(NonCopy)];
if let [Some(_x), Some(_y)] = array {}
}
Хорошие новости
Этот код работает как есть, когда включены нелексические времена жизни .
Плохие новости
Нелексические времена жизни еще не стабильны.
Обходной путь
Явно передать владение массивом выражению заголовка match
или if let
:
let array = [Some(NonCopy), Some(NonCopy)];
if let [Some(_x), Some(_y)] = { array } {}
Объяснение
Текущая реализация средства проверки заимствований основана на AST, а будущая реализация будет основана на MIR. На высоком уровне вы можете думать об этом как о «работе над кодом в том виде, в котором я его набрал» (AST) и «работе над логическим потоком данных в моем коде» (MIR).
Определенные «хаки» были добавлены в средство проверки заимствования AST, поэтому вы можете успешно использовать литерал массива, но не переменную. При использовании средства проверки заимствований MIR такие большие хаки исчезают, а средство проверки заимствований также становится более точным, что позволяет компилировать больше кода.