Size: a a a

2020 December 05

MB

Mikail Bagishov in Rust Beginners
Max Kot
Так кинуть или на какой-то сайт загрузить?
Если маленький то можно скинуть тут, иначе playground/gist/еще что-нибудь
источник

IP

Iaroslav Postovalov in Rust Beginners
George
Добрый день.
Пишу бэк и параллельно осваиваю макросы. Понял, что декларативных мне мало, ибо существующие разрешённые токены порой не позволяют порой писать так, как хочется, да и возможность парсинга процмакросы иногда дают иные.
Попробовал написать процедурный. Минусов значительное количество:
- Cannot find declaration to go to при тыках на сам макрос/создаваемые им вещи
-  полное отсутствие этих вещей в скоупе автокомплита что у Inteleji Rust, что у RA. Декларативные хотя бы не надо помнить наизусть.
- сложнее их изучить.
- код уходит в другой крейт, сложнее поддерживать актуальность

Плюсы, собственно, тоже понятные: вообще любой текст можно внутрь пихать, ибо парсинг идёт вручную.

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

Хотелось бы услышать "за" и "против" от тех, кто уже давно пишет.

Если да - подмогите ресурсами по процмакросам и парсингу, например, как реализовать переменное количество аргументов и так далее. Пока изучал function-like по экзамплам из syn (пример с lazy_static!).
а в хаскеле вообще тулинг ничего не может делать
источник

KR

Kai Ren in Rust Beginners
George
Добрый день.
Пишу бэк и параллельно осваиваю макросы. Понял, что декларативных мне мало, ибо существующие разрешённые токены порой не позволяют порой писать так, как хочется, да и возможность парсинга процмакросы иногда дают иные.
Попробовал написать процедурный. Минусов значительное количество:
- Cannot find declaration to go to при тыках на сам макрос/создаваемые им вещи
-  полное отсутствие этих вещей в скоупе автокомплита что у Inteleji Rust, что у RA. Декларативные хотя бы не надо помнить наизусть.
- сложнее их изучить.
- код уходит в другой крейт, сложнее поддерживать актуальность

Плюсы, собственно, тоже понятные: вообще любой текст можно внутрь пихать, ибо парсинг идёт вручную.

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

Хотелось бы услышать "за" и "против" от тех, кто уже давно пишет.

Если да - подмогите ресурсами по процмакросам и парсингу, например, как реализовать переменное количество аргументов и так далее. Пока изучал function-like по экзамплам из syn (пример с lazy_static!).
Пишу процмакросы давно и много. В основном дерайвы и аттрибуты. Не представляю как без них вообще жить, ибо любой нетривиальный код абстракций закончится тонной бойлерплейта, который проц-макросы позволяют красиво прятать оставляя простой и понятный декларативный код. Все минусы с автокомплитами и дополнительным крейтом в workspace того стоят.

Проблем с написанием вроде нет. Такой же Rust-код как и остальное, только парсящий/формирующий синтаксис.

Каких-то особенных материалов для освоения не припомню. У меня происходило так: есть понимание что нужно запихнуть под кодогенерацию - берём в зубы proc-macro2, syn, quote вместе с их докой - и вперёд.
источник

KR

Kai Ren in Rust Beginners
Ну и да, вероятно следует смотреть примеры. Как в известных либах сделано.
источник

G

George in Rust Beginners
Kai Ren
Пишу процмакросы давно и много. В основном дерайвы и аттрибуты. Не представляю как без них вообще жить, ибо любой нетривиальный код абстракций закончится тонной бойлерплейта, который проц-макросы позволяют красиво прятать оставляя простой и понятный декларативный код. Все минусы с автокомплитами и дополнительным крейтом в workspace того стоят.

Проблем с написанием вроде нет. Такой же Rust-код как и остальное, только парсящий/формирующий синтаксис.

Каких-то особенных материалов для освоения не припомню. У меня происходило так: есть понимание что нужно запихнуть под кодогенерацию - берём в зубы proc-macro2, syn, quote вместе с их докой - и вперёд.
Спасибо за развёрнутый ответ.

Как я понимаю, у derive-макросов всё же раскрытие работает лучше? Там автокомплит подтягивается хотя бы. Либо это засчёт импортированных трейтов и пониманием анализатора что вот эта штука *где-то* имеет реализацию трейта, значит, можно и методы подсунуть?

А какие есть примеры либ с относительно короткими/понятными макросами? Чтобы можно было смотреть и понимать, как оно там происходит вообще.
источник

Е

Егор in Rust Beginners
Привет. я сейчас хочу реализовать http сервер на базе tokio, но возникла проблема при подключение через браузер или nc при чтение сокета срабатывает
 Ok(n) if n == 0 => {
                           println!("error: {}",n);
                           return
                       },
где я допустил ошибку? сам код выглядит так https://gist.github.com/faf234a2f7f50cac2910d4874b72a240.git
источник

MB

Mikail Bagishov in Rust Beginners
n == 0 это не ошибка, это просто означает что сокет с той стороны закрыли
источник

Kr

Kemal raihan in Rust Beginners
consider upgrading
источник

AZ

Andrey Z in Rust Beginners
А можно ли (и если можно то как) в match в значении ветви использовать переменные? Вот такой пример: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fd9a8550390cb5b712d0aed9472e13b6 Я понимаю, почему он не работает, но не понимаю, как сделать чтобы работал.
источник

ИЛ

Иван Лещенко... in Rust Beginners
Andrey Z
А можно ли (и если можно то как) в match в значении ветви использовать переменные? Вот такой пример: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fd9a8550390cb5b712d0aed9472e13b6 Я понимаю, почему он не работает, но не понимаю, как сделать чтобы работал.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d8b73c13d40daeb783762a07633162f9.
Впрочем, в данном случае подошёл бы и просто if
источник

AZ

Andrey Z in Rust Beginners
Спасибо! В данном случае, конечно, лучше if, но это рафинированный случай.
источник

KR

Kai Ren in Rust Beginners
George
Спасибо за развёрнутый ответ.

Как я понимаю, у derive-макросов всё же раскрытие работает лучше? Там автокомплит подтягивается хотя бы. Либо это засчёт импортированных трейтов и пониманием анализатора что вот эта штука *где-то* имеет реализацию трейта, значит, можно и методы подсунуть?

А какие есть примеры либ с относительно короткими/понятными макросами? Чтобы можно было смотреть и понимать, как оно там происходит вообще.
derive_more, thiserror, smart_default ... это если про небольшие
источник

k

kirill in Rust Beginners
Можно ли распаковать кортеж как в питоне?  т.е. в таком примере:

   let tuple = (1, "привет", 4.5, true);
   let (a, b, c, d) = tuple;
   println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);
источник

k

kirill in Rust Beginners
Убрать вообще вторую строчку и в третьей что-то типа:

   println!("{:?}, {:?}, {:?}, {:?}", *tuple);
источник

С

Саша in Rust Beginners
antuan
плагинчик для детищ jetbrains юзаю, так что как-нибудь без меня давайте))
а жаль, тоже эту фичу жду )
источник

/

/bin/cat in Rust Beginners
George
Спасибо за развёрнутый ответ.

Как я понимаю, у derive-макросов всё же раскрытие работает лучше? Там автокомплит подтягивается хотя бы. Либо это засчёт импортированных трейтов и пониманием анализатора что вот эта штука *где-то* имеет реализацию трейта, значит, можно и методы подсунуть?

А какие есть примеры либ с относительно короткими/понятными макросами? Чтобы можно было смотреть и понимать, как оно там происходит вообще.
miniserde
источник

NB

Nik Bond in Rust Beginners
Есть немножко вопросов:
А может быть такой итератор, который возвращает какой-то элемент после того как вернул None?
Поскольку имплементация некоторого итератора полностью на совести автора, такое может произойти и трейт Iterator никак это не ограничивает, верно?
Если итератор так делает, то это ошибка и его нужно переписать, верно?
И последнее: Нужно ли, по хорошему, запоминать в итераторе что-то типа is_finished, чтобы сразу возвращать None и не запускать основную логику, которая в итоге все ранво вернет None?
источник

P

Paper_doll_96 in Rust Beginners
Nik Bond
Есть немножко вопросов:
А может быть такой итератор, который возвращает какой-то элемент после того как вернул None?
Поскольку имплементация некоторого итератора полностью на совести автора, такое может произойти и трейт Iterator никак это не ограничивает, верно?
Если итератор так делает, то это ошибка и его нужно переписать, верно?
И последнее: Нужно ли, по хорошему, запоминать в итераторе что-то типа is_finished, чтобы сразу возвращать None и не запускать основную логику, которая в итоге все ранво вернет None?
Итерация заканчивается, после того, как next вернул None
источник

a

antuan in Rust Beginners
Paper_doll_96
Итерация заканчивается, после того, как next вернул None
Some(None)? :)
источник

P

Paper_doll_96 in Rust Beginners
Paper_doll_96
Итерация заканчивается, после того, как next вернул None
Вернее на первом же None
источник