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 ответов

21 просмотр

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта