sirve - ¿Cómo se permiten comas finales opcionales en macros?
qué es un macro en access y para qué sirve (1)
Puede manejar ambos casos ... manejando ambos casos:
macro_rules! define_enum {
($Name:ident { $($Variant:ident,)* }) => {
pub enum $Name {
None,
$($Variant),*,
}
};
($Name:ident { $($Variant:ident),* }) => {
define_enum!($Name { $($Variant,)* });
};
}
define_enum!(Foo1 { A, B });
define_enum!(Foo2 { A, B, });
fn main() {}
Hemos trasladado la implementación principal a la versión que espera la coma final. Luego agregamos una segunda cláusula que empareja el caso con la coma que falta y la reescribe a la versión con una coma.
DK. señala una alternativa , haciendo que la coma final sea opcional:
($Name:ident { $($Variant:ident),* $(,)* }) => {
Esto evita la necesidad de delegar de una implementación a la otra.
Aquí hay un ejemplo sintético de lo que quiero:
macro_rules! define_enum {
($Name:ident { $($Variant:ident),* }) => {
pub enum $Name {
None,
$($Variant),*,
}
}
}
define_enum!(Foo { A, B });
Este código compila, pero si le agrega una coma:
define_enum!(Foo { A, B, });
// ^
La compilación falla. Puedo arreglarlo con:
($Name:ident { $($Variant:ident,)* })
// ^
pero luego define_enum!(Foo { A, B });
falla,
¿Cómo debo escribir una macro para manejar ambos casos?
define_enum!(Foo { A, B });
define_enum!(Foo { A, B, });