Блог*
Своё решение выложу вечером в пятницу
Итак, в чём же сложность данной задачи? В контекстной зависимости. Форматирование каждого терма зависит от того, в каком контексте он находится. Соответственно, для корректного форматирования нужно этот самый контекст передавать. Это также позволяет избежать смешения ответственности: каждый вариант сам отвечает за своё форматирование и не смотрит на внутренние термы, лишь прокидывает корректный контекст.
Что же в данном случае является контекстом? Знак перед термом. Причём важно то, какой именно: плюс или минус. Также важно, что это опциональное значение: на верхнем уровне никаких знаков перед выражением нет.
Положительный литерал не нужно обрамлять в скобки, отрицательный литерал — нужно, но только если перед ним есть знак. Или, иными словами, отрицательный литерал не нужно обрамлять в скобки только в том случае, если он является первым слагаемым в выражении целиком — или уже отделён скобками.
Отрицание схоже с отрицательным литералом: только первое слагаемое не нужно обрамлять скобками, в остальных случаях надо. При форматированию вложенному терму в качестве контекста передаётся знак минус.
Сложение — тот случай, когда нужно различать плюс от минуса в переданном контексте. В случае плюса или отсутствующего знака можно форматировать как есть, а в случае минуса перед сложением нужно ставить скобки. Так как это сложение, для второго слагаемого контекстом всегда является знак плюс. Для первого слагаемого немного сложнее: если скобки не ставятся, то контекст пробрасывается (так как знак перед термом тот же самый), а если ставятся, то, очевидно, никаких знаков перед первым слагаемым нет и в качестве контекста передаётся
Код
Что же в данном случае является контекстом? Знак перед термом. Причём важно то, какой именно: плюс или минус. Также важно, что это опциональное значение: на верхнем уровне никаких знаков перед выражением нет.
Положительный литерал не нужно обрамлять в скобки, отрицательный литерал — нужно, но только если перед ним есть знак. Или, иными словами, отрицательный литерал не нужно обрамлять в скобки только в том случае, если он является первым слагаемым в выражении целиком — или уже отделён скобками.
Отрицание схоже с отрицательным литералом: только первое слагаемое не нужно обрамлять скобками, в остальных случаях надо. При форматированию вложенному терму в качестве контекста передаётся знак минус.
Сложение — тот случай, когда нужно различать плюс от минуса в переданном контексте. В случае плюса или отсутствующего знака можно форматировать как есть, а в случае минуса перед сложением нужно ставить скобки. Так как это сложение, для второго слагаемого контекстом всегда является знак плюс. Для первого слагаемого немного сложнее: если скобки не ставятся, то контекст пробрасывается (так как знак перед термом тот же самый), а если ставятся, то, очевидно, никаких знаков перед первым слагаемым нет и в качестве контекста передаётся
None
.Код
🤯6🤮4👍2🤔2❤1
#prog #rust хайлайты:
* макрос
* раньше алиасы типов были чем-то вроде макросов в том смысле, что их корректность проверялась после раскрытия. Синтаксически Rust позволяет иметь ограничения на обобщённые типы у алиасов, но они игнорируются. После этого PR они действительно проверяются — правда, пока лишь за фичей.
* парсер Rust теперь корректно обрабатывает тернарный оператор и выдаёт сообщение о том, что такового в Rust нет.
* реализованы обобщённые константы. Фича пока сырая, даже RFC под неё не написан.
* конструкторы слабых счётчиков ссылок теперь стабилизированы как const-функции, как и NonNull::as_ref
*
*
* rustdoc некорректно рендерил
Было:
*
*
* макрос
env!
теперь работает и с сырыми строками.* раньше алиасы типов были чем-то вроде макросов в том смысле, что их корректность проверялась после раскрытия. Синтаксически Rust позволяет иметь ограничения на обобщённые типы у алиасов, но они игнорируются. После этого PR они действительно проверяются — правда, пока лишь за фичей.
* парсер Rust теперь корректно обрабатывает тернарный оператор и выдаёт сообщение о том, что такового в Rust нет.
* реализованы обобщённые константы. Фича пока сырая, даже RFC под неё не написан.
* конструкторы слабых счётчиков ссылок теперь стабилизированы как const-функции, как и NonNull::as_ref
*
AtomicBool
имеет такое же представление в памяти, как и bool
. Некоторые платформы не имеют нативных атомарных операций для 8-битных значений и потому эмулируют их при помощи CAS-циклов на атомиках большего размера. Этот PR переделывает swap-операции над AtomicBool
на атомарные and и or, эксплуатируя тот факт, что bool
может иметь только значения 0 и 1. Это изменение положительно сказалось на генерируемом коде.*
io::Empty
теперь умеет то же, что и io::Sink. Внимание, этот тривиальный PR проболтался БОЛЬШЕ ГОДА!!!* rustdoc некорректно рендерил
impl Sized
типы. Этот PR исправляет недоработкуБыло:
fn sized(x: impl ) -> impl
fn sized_outlives<'a>(x: impl 'a) -> impl 'a
fn maybe_sized(x: &impl ) -> &impl
fn debug_maybe_sized(x: &impl Debug) -> &impl ?Sized + Debug
Стало (как и должно быть):fn sized(x: impl Sized) -> impl Sized
fn sized_outlives<'a>(x: impl Sized + 'a) -> impl Sized + 'a
fn maybe_sized(x: &impl ?Sized) -> &impl ?Sized
fn debug_maybe_sized(x: &(impl Debug + ?Sized)) -> &(impl Debug + ?Sized)
* В clippy есть линт на код подобного вида:let mut vec = Vec::with_capacity(len);
vec.resize(len, 0);
, предлагая переписать наlet mut vec = vec![0; len];, что и идиоматичнее, и быстрее. Теперь линт также работает, если вектор инициализирован через
Vec::new()
.*
map_or
на Result
и Option
помечен, как #[must_use].*
Command
теперь может перенаправлять stderr порождённого процесса в stdout родителя.GitHub
builtin_macros: expect raw strings too by davidtwco · Pull Request #114014 · rust-lang/rust
Fixes #114010.
expr_to_string allows raw strings through so this code should be expected to handle those.
expr_to_string allows raw strings through so this code should be expected to handle those.
❤5👍3
А ты анимешник?
Anonymous Poll
6%
Как ты только мог такое предположить?
15%
Да
21%
Можно сказать, что да
17%
Скорее нет
25%
Нет
4%
Ты думал, что анимешником был ты
13%
НО ЭТО БЫЛ Я, ДИО!
🤡12👍4🤮2💩2👎1
Хочешь почувствовать себя старым?
Первый фильм про Гарри Поттера вышел в 2001 году.
Первый фильм про Гарри Поттера вышел в 2001 году.
😱7👎1
Технологический Болт Генона
https://fuckjava.com Подглядел в одном из закрытых чатов.
Ну так-то жавба против гадюки
😁5