172 похожих чатов

Чат, спасайте. хочу вынести в макро доступ к атрибутам

self.

грубо говоря, макрос должен выглядеть примерно так:

macro_rules! to_format_bytes {
( $type:ty, $fmt:expr, $( self.$( $arg:tt )+ ),* ) => {
impl Message for $type {
fn to_bytes(&self) -> String {
format!($fmt, $( self.$( $arg )+ ),* );
}
}
}
}
to_format_bytes!(Version, "{} {}\r", 0.hardware, 0.software);

но сам self передавать нельзя (потому что гигиена),

а вот это $( $arg:expr )* => $( self.$arg )* не работает (потому что хз почему, но error: unexpected token: `0` in this macro invocation:

to_format_bytes!(Name, "{}\r", 0);

через дважды завернутый в повторения через запятую $( self.$( $arg:tt )+ ),* ) тоже не тащит, по причине

error: local ambiguity: multiple parsing options: built-in NTs tt ('arg') or 1 other option.



и что делать и куда податься?

12 ответов

22 просмотра

ident

Dårk-Pit Автор вопроса
kitsu
ident

повторение идентов через точку?

Dårk Pit
повторение идентов через точку?

Просто поменяй тип аргумента с expr на ident. У тебя там есть только идентификатор, а не выражение

Dårk-Pit Автор вопроса
Dårk Pit
self.0.hardware это уже не просто ident

Не просто, да, но в примере такого нет

Dårk-Pit Автор вопроса
kitsu
Не просто, да, но в примере такого нет

ну ваще-т там есть) хотя и без вынесенного self.

Dårk Pit
ну ваще-т там есть) хотя и без вынесенного self.

А, сорян, я только в плейграунд смотрел. Можешь дереф навернуть как вариант

let $this = self; в подобных ситуациях спасает.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f8f0e894cb66fbc9fadae82bd70985d6

Dårk-Pit Автор вопроса
вафель 🧇🍓
let $this = self; в подобных ситуациях спасает.

ух-ты, круто! я прикидывал, как туда воткнуть this, но до такого фундаментального решения не догадался)

Dårk Pit
ух-ты, круто! я прикидывал, как туда воткнуть thi...

Обычно пишут match в макросах вместо let. Но для того же, да

Dårk-Pit Автор вопроса
Αλεχ Zhukovsky
Обычно пишут match в макросах вместо let. Но для т...

насколько я помню из дискуссии о внутренностях print{,ln}! семейства, match удобен временным продлением жизни временных объектов ровно на период (scope) выполнения блока match

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта