мне не нравится реальность
517 subscribers
1.35K photos
57 videos
56 files
1.04K links
Мне не нравится реальность
N.B. waffle is unhinged

- кормить назад: @meowaffle
- кормить вперёд: github.com/sponsors/WaffleLapkin
- чят: https://xn--r1a.website/+5Dtuan4dVE5kYTcy
- блог: blog.ihatereality.space
Download Telegram
Эхх, как же хочется TCOшечку
# Implied cfg(doc)

В расте можно изменять поведение и наличие кода в зависимости от флагов компиляции. Это делается через макрос cfg. Распространёнными юзкейсами являются платформозависимые вещи и дополнительные фичи, которые не хочется компилировать, если они не нужны.

#[cfg(linux)]
fn platform_specific(...) { ... }

#[cfg(feature = "blah")]
fn blah(...) { ... }

Хоть такой подход и позволяет сделать многое, у него есть один критический недостаток — "выключение" кода происходит на этапе AST. Из-за этого, если фича не включена, то ошибка будет просто "нет функции", а не "функция выключена из-за фичи".

Поскольку компилятор не может помочь, то приходится делать по старинке — через документацию. Раньше единственный вариант задокументировать такое был просто написать документацию руками:

/// Note: supported on crate feature `blah` only.
#[cfg(feature = "blah")]
fn blah(...) { ... }

Однако это неудобно, про это легко забыть, все делают это по разному и в разных местах... В общем не круто.

Позже появилась фича doc_cfg, которая позволяет делать так:

#[cfg(feature = "blah")]
#[doc(cfg(feature = "blah"))]
fn blah(...) { ... }

Дублирование всё ещё есть, но по крайней мере rustdoc сам это красиво и одинакого для всех рендерит :)

Правда по скольку фича найтли, а документировать надо всем, то обычно это превращается в что-то подобного плана:

#[cfg_attr(all(docsrs, feature = "nightly"), doc(cfg(feature = "blah")))]

Всё ещё лучше, чем ничего, но очень бойлерплейтно и неудобно. Но и тут есть спасение!

Make cfg imply doc(cfg) #89596

Совсем недавно cfg начал подразумевать doc(cfg), так что теперь всё что нужно сделать, для красивой доки, это включить найтли фичу doc_cfg =)
(вот так rustdoc сейчас рендерит cfg)
Porting Niceware to Rust

"I've been thinking about the sensation of incremental progress when programming with Rust. I come from dynamic programming land and I recently had a breakthrough with my productivity in Rust — instead of a technical challenge, I had to overcome an emotional barrier"
Видимо собаки !Sized
трижды краденый мем
ничего не сделал сегодня, а всё равно очень устал(