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.
и что делать и куда податься?
ident
повторение идентов через точку?
Просто поменяй тип аргумента с expr на ident. У тебя там есть только идентификатор, а не выражение
self.0.hardware это уже не просто ident
Не просто, да, но в примере такого нет
ну ваще-т там есть) хотя и без вынесенного self.
А, сорян, я только в плейграунд смотрел. Можешь дереф навернуть как вариант
let $this = self; в подобных ситуациях спасает.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f8f0e894cb66fbc9fadae82bd70985d6
ух-ты, круто! я прикидывал, как туда воткнуть this, но до такого фундаментального решения не догадался)
Обычно пишут match в макросах вместо let. Но для того же, да
насколько я помню из дискуссии о внутренностях print{,ln}! семейства, match удобен временным продлением жизни временных объектов ровно на период (scope) выполнения блока match
Обсуждают сегодня