Forwarded from мне не нравится реальность
# методы в трейтах под #[cfg]
Условная компиляция (aka conditional compilation) часто используется в расте, чтобы добавить какой-то функционал только если включена определённая фича. Но есть проблема — в трейтах такое сложно применять т.к. если крейт
Можно использовать дефолтные реализации, но это путь вникуда. Честно. Никаких
Настоящее решение проблемы /которое я подсмотрел в serde/ — сделать макрос который с фичей раскрывается то что ему передали, а без — в ничего.
Чтобы потом пользователи библиотеки могли легко реализовать твой трейт:
#rust #tip
Условная компиляция (aka conditional compilation) часто используется в расте, чтобы добавить какой-то функционал только если включена определённая фича. Но есть проблема — в трейтах такое сложно применять т.к. если крейт
A
реализует твой трейт, но не использует твою фичу, то он отдельно может компилироваться, а с крейтом B
, который использует твою фичу — нет т.к. крейт A
не реализует требуемую функцию. (я вас не запутал?)Можно использовать дефолтные реализации, но это путь вникуда. Честно. Никаких
unimplemented!()
. Пожалуйста.Настоящее решение проблемы /которое я подсмотрел в serde/ — сделать макрос который с фичей раскрывается то что ему передали, а без — в ничего.
#[cfg(feature = "feature")]
#[macro_export]
macro_rules! if_feature {
($($tt:tt)*) => {
$($tt)*
};
}
#[cfg(not(feature = "feature"))]
#[macro_export]
macro_rules! if_feature {
($($tt:tt)*) => {};
}
Чтобы потом пользователи библиотеки могли легко реализовать твой трейт:
impl Trait for Type {
// ...
lib::if_feature! {
fn uses_feature() {
// ...
}
}
}
#rust #tip
Forwarded from мне не нравится реальность (вафель 🧇🍓)
Поэтому #tip: если у вас используется
serde
для чего-то внутреннего, добавляйте на все структуры #[serde(deny_unknown_fields)]. Так вы быстрее узнаете о опечатках и рассинхронизации в компонентах.
#prog #tip
Встроенное в VS Code расширение для работы с Git очень помогает с ребейзами: показывает сообщение коммита, которое можно тут же и отредактировать, показывает отдельно списки staged changes и unstaged changes, одной кнопкой позволяет перевести отдельный файл из второе в первое, а также предупреждает, если вы пытаетесь застейджить файл с маркерами конфликта слияния (и да, конкретно этот пункт мне уже разок помог).
UPD: предупреждает при попытке застейджить файл с несохранёнными изменениями.
Встроенное в VS Code расширение для работы с Git очень помогает с ребейзами: показывает сообщение коммита, которое можно тут же и отредактировать, показывает отдельно списки staged changes и unstaged changes, одной кнопкой позволяет перевести отдельный файл из второе в первое, а также предупреждает, если вы пытаетесь застейджить файл с маркерами конфликта слияния (и да, конкретно этот пункт мне уже разок помог).
UPD: предупреждает при попытке застейджить файл с несохранёнными изменениями.
👌11