Без обид, но мне кажется что вы... ну не очень хорошо знаете синтаксис раста. Потому что в этой строке ни одного макроса.А '?' это оператор распаковки Option value, try_new возвращает Option<Self> (можно глянуть доку https://docs.rs/boxext/0.1.6/boxext/trait.BoxExt.html)
Это гарантирует Null safety - компилятор тебя обяжет или получить значение и работать с ним, или обработать это одним из способов. И не нужно будет писать кучу проверок на null при обращении к значению. Т.е. без ухищрений невозможно будет обратиться к null объекту.
В отличие от с и с++ - там или проверяешь каждый раз, или забиваешь и надеешься на лучшее.
Это кстати не изобретение раста - оно появилось в эйфиле, а потом в C#, Kotlin, Swift, Dart и других.
> BEGIN_MENU(level1_menu)
Как будто что-то мешает написать аналогичное на расте. Ну, только без богомерзких begin-end.
let mut menu = Menu::new();
menu.add("1", "Do something 1!", handler1);
menu.add("2", "Do something 2!", handler2);
И добавляешь сколько нужно. И никаких чеков, никаких закорючек. Даже более короткий и существенно менее отвратительный чем ваш вариант.
> раст высокоуровневее
Конечно высокоуровневее. В си вы опечатались и вместо значения одного enum написали другой такого же базового типа. И ведь молча схавает. Про nested enums можно даже не вспоминать.
Null safety - спасает от целого класса ошибок. Паттерн-матчинг - не киллер фича, но штука крутая (не, ну можно конечно все тоже самое нафигачить ифами, но... зачем?) Zero-Sized Types. Много элементов системного программирования.
И это без наверное главных фишек раста вроде borowing, ownership и lifetimes.
Да тут очень долго можно перечислять. Потому что си это по факту переносимый человекочитабельный ассемблер.
А синтаксис - это вкусовщина. Кто-то обожествляет лисп, а других от него блевать тянет. Или паскаль (хехе, begin-end). Но минимального знания раста дальнейший разговор не имеет смыслы - вы просто не совсем понимаете что там написано.