вот что такое этот x в Some(x) в первой функции? если это референс, то почему я не могу сматчить его с &? если это не референс, то почему я могу его разыменовать?
меня очень запутывают а их нельзя отключить?
не эт фича языка
референсы можно матчить с паттерном &pat
но это не работает, как видно из второго примера
fn this_doesnt(x: &Option<u8>) -> u8 { match x { &Some(x) => x, _ => panic!(), } }
да, но я-то про x у него разный тип внутри паттерна и снаружи это confusing про это даже issue есть, оказыца https://github.com/rust-lang/rust/issues/64586
раньше нужно было писать ref Some(ref x) => *x
нет, просто Some(ref x)
Там всякое бывало
https://rust-lang.github.io/rust-clippy/master/index.html#pattern_type_mismatch это не оно случайно?
лол, это что, линт, чтобы запретить использовать match ergonomics в коде? ахахах
Потому что референс всё ещё относится ко всему, что находится снаружи, а эргономика работает только на то, чтобы попытаться перенести наружние ссылки вовнутрь
она работает для значения, но не для паттерна причём для значения только если нет модификатора mut
Да, иначе были бы проблемы с неявностью выбора при составном типе. Пиши совсем без эргономик, если не нравится, но они и так очень сильно жизнь упрощают. Это как жаловаться на lifetime elision.
не вижу проблем в поведении «ссылка и в паттерне, и в значении»
ну, это добавило бы второй уровень ссылки
О, в егуи онлайн демо теперь поле ввода клаву и шорткаты поддерживает
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0e89bef56db56dca8f910eff72e82219
Обсуждают сегодня