Size: a a a

Rust — русскоговорящее сообществo

2020 September 28

Э

Эрик in Rust — русскоговорящее сообществo
remove у VecDeque почти на сотню строк.
источник

Э

Эрик in Rust — русскоговорящее сообществo
drain удаляет непрерывную слайсу, там относительно просто.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Однако retain есть, мне кажется drain_filter не сильно сложнее 🤔
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
DrainFilter должен делать то же самое, что у вектора, но с щепоточкой idx % len
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Однако retain есть, мне кажется drain_filter не сильно сложнее 🤔
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Однако retain есть, мне кажется drain_filter не сильно сложнее 🤔
Если на первом выдаст false, а на всех остальных true, то будет len - 1 свапов.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Векторный вроде бы поэффективнее.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Главное, что асимптотика линейная.
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
А насколько реально написать декларативный макрос, который бы вызывался примерно вот так:
my_macro!(
   fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String>
)
и генерировал вот такой код:
fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String> {
   match self {
       Adapter::Memory(adapter) => adapter.get_download_url(name, expires_in),
       Adapter::S3(adapter) => adapter.get_download_url(name, expires_in),
   }
}
Т.е. макросу надо "распарсить" хотя бы имя метода, его аргументы с типами (кроме &self) и тип результата, и просто подставить их в фиксированный шаблон.

Или такое возможно только процедурными макросами сделать?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
DrainFilter должен делать то же самое, что у вектора, но с щепоточкой idx % len
Там придётся ещё писать кучу всяких fold, try_fold и прочей гадости, потому что vecdeque может быть двухслайсовый.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А насколько реально написать декларативный макрос, который бы вызывался примерно вот так:
my_macro!(
   fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String>
)
и генерировал вот такой код:
fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String> {
   match self {
       Adapter::Memory(adapter) => adapter.get_download_url(name, expires_in),
       Adapter::S3(adapter) => adapter.get_download_url(name, expires_in),
   }
}
Т.е. макросу надо "распарсить" хотя бы имя метода, его аргументы с типами (кроме &self) и тип результата, и просто подставить их в фиксированный шаблон.

Или такое возможно только процедурными макросами сделать?
По идее проблем быть не должно
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Если у тебя нет дженериков пожалуй
источник

Э

Эрик in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А насколько реально написать декларативный макрос, который бы вызывался примерно вот так:
my_macro!(
   fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String>
)
и генерировал вот такой код:
fn get_download_url(&self, name: &str, expires_in: Option<Duration>) -> Option<String> {
   match self {
       Adapter::Memory(adapter) => adapter.get_download_url(name, expires_in),
       Adapter::S3(adapter) => adapter.get_download_url(name, expires_in),
   }
}
Т.е. макросу надо "распарсить" хотя бы имя метода, его аргументы с типами (кроме &self) и тип результата, и просто подставить их в фиксированный шаблон.

Или такое возможно только процедурными макросами сделать?
macro_rules! q {
(fn $fn_name:ident $(< $($generic:ident),+ >)? ($(&$(mut)?)? $(self,)? $(arg:ident : $arg_type: ty,)* ) $(-> $ret_type:ty)? ) => {};
}
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
macro_rules! q {
(fn $fn_name:ident $(< $($generic:ident),+ >)? ($(&$(mut)?)? $(self,)? $(arg:ident : $arg_type: ty,)* ) $(-> $ret_type:ty)? ) => {};
}
ты так &mut self не сможешь восстановить
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
вафель 🧇
ты так &mut self не сможешь восстановить
Придётся наверное матчить $(self: $SelfTy:ty)?. (если хочется разных селфов)

Писать немного больше, зато работает
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
вафель 🧇
ты так &mut self не сможешь восстановить
А мне и не требуется это, у меня все методы трейта, для имплементации которого мне надо это сделать, используют только &self
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А мне и не требуется это, у меня все методы трейта, для имплементации которого мне надо это сделать, используют только &self
Ну тогда просто его и матчить
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Хм, похоже процедурные макросы применяются перед декларативными. Т.е. они не видят результат работы декларативных и вся моя задумка с декларативным макросом идёт лесом. Придётся просто копи-пастить руками.
источник

V

Vladimir in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Хм, похоже процедурные макросы применяются перед декларативными. Т.е. они не видят результат работы декларативных и вся моя задумка с декларативным макросом идёт лесом. Придётся просто копи-пастить руками.
Скорее всего просто внешние макросы применяются перед внутренними, а не процедурные перед декларативными. И не важно процедурные или декларативные.
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Да, видимо что так и есть.
источник