Почему "pattern bindings are not allowed after an `@`"?


#1
// compiles:
// fn power_level(pos @ (_, _): (u16, u16)) -> i64 { pos.0 as _ }

// fails to compile: "error[E0303]: pattern bindings are not allowed after an `@`":
fn power_level(pos @ (x, _): (u16, u16)) -> i64 { pos.0 as _ }

fn main() {
    let x = power_level((1, 2));
    println!("{}", x)
}

Playground

Вообще не понимаю почему такое ограничение есть. Вроде бы это Copy типы, должно бы просто скопироваться и все.


https://doc.rust-lang.org/error-index.html#E0303 - тут объяснение ошибки по коду левое какое-то, пример выше ни к какому нарушению работы с памятью не должен бы приводить.


#2

https://t.me/rustlang_ru/184364

TLDR как я понял: в 14ом году, нарвавшись на проблемы таких конструкций со ссылками, решили не тратить время на правильную реализацию, а просто временно запретить все это хозяйство. Ну и до сих пор никому оно не понадобилось настолько, что бы реализовать правильный вариант.


#3

А если не Copy, как тогда быть?


#4

Тогда ошибка должна быть, потому что мы ж не можем взять не-Copy тип и втихую скопировать его целиком или частично.


#5

@ozkriff А можешь это в том ишью написать? Ну просто, чтобы не забывлось у них там в общем потоке.


#6

Спросил там про планы.