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

// 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 - тут объяснение ошибки по коду левое какое-то, пример выше ни к какому нарушению работы с памятью не должен бы приводить.

https://t.me/rustlang_ru/184364

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

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

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

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

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

Спустя три года эту штуку таки починили и стабилизировали в Rust 1.56 - https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html#new-bindings-in-binding--pattern - и теперь изначальный пример вполне себе собирается и работает. :slight_smile:

1 лайк