2016-11-03 3 views
2

Ich bin ein Makro mit einer primitiven Struktur zu erweitern: kannMöglich, Attribute * nach * einer Strukturdeklaration abzuleiten?

pub struct MyTypedNumber(pub u32); 
struct_impl_my_features!(MyTypedNumber); 

Die struct_impl_my_features Makrofunktionen für MyTypedNumber & Merkmale implementieren, gibt es jedoch einen Fall, in dem die Nutzungs #[derive(PartialEq, Eq)] verwenden - zum Beispiel.

Ist es möglich, #[derive(...)] zu verwenden, nachdem die Struktur bereits deklariert wurde?

Eine Alternative ist in der Struktur Definition als item Argument für ein Makro weitergeben müssen:

struct_impl_my_features!(
    pub struct MyTypedNumber(pub u32);, 
    MyTypedNumber 
); 

Dies funktioniert, so dass es die beste Option sein kann, obwohl es ziemlich klobig und bedeutet die Erklärung und Makro Erweiterung muss zusammen sein.

Siehe this complete example, das Makro heißt struct_bitflag_impl (zweites Beispiel).


ich um dieses arbeitete von PartialEq und Eq manuell Umsetzung aber ich in einem Fall lief, wo Rust muss#[derive(...)] innerhalb match Anweisung als Konstanten verwendet werden:

= warning: this was previously accepted by the compiler but is being phased out; 
    it will become a hard error in a future release! 
= note: for more information, 
    see RFC 1445 <https://github.com/rust-lang/rfcs/pull/1445> 
+1

Können Sie bitte ein vollständiges Beispiel hinzufügen? Was hat MyTypedNumber mit MyTypedInt zu tun? –

+0

'MyTypedInt' versehentlich eingelassen, korrigiert - Link zum vollständigen Beispiel hinzugefügt. – ideasman42

+0

Derive macht nichts Magisches. Sie sollten in der Lage sein, genau die gleiche Implementierung manuell zu tun, wie es der Fall ist. Könnten Sie das Beispiel angeben, in dem Sie das Gefühl haben, dass Sie ableiten müssen? – paholg

Antwort

0

Das „vollständiges Beispiel "Link, den Sie bereitstellen zeigt zeigen ein Beispiel für die Makro-Präfix-Attribute (siehe das zweite Makro).

#[derive(PartialEq, Eq, Copy, Clone, Debug)] 
    $struct_p_def 

Wenn jedoch stattdessen wollen Sie in der Lage sein zu liefern derive-Attribute pro Struktur (zB nur müssen einige Ihrer structs PartialEq abzuleiten), können Sie den derive Ausdruck in dem ersten Teil des zweiten passieren kann struct_impl_my_features! Beispiel — Die Attribute werden als Teil des Makros item betrachtet. Z. B.

struct_impl_my_features!(
    #[derive(PartialEq, Eq)] 
    pub struct MyTypedNumber(pub u32);, 
    MyTypedNumber 
); 

aktualisieren

Sorry, ich habe keine Antwort auf Ihre Hauptfrage haben; Soweit ich weiß, ist das nicht möglich. Allerdings, wenn Ihr Hauptanliegen ist die clunkiness, und wenn Ihr structs alle ähnlicher Form sind, können Sie Ihre Makroaufruf schöner machen, indem diese an die Spitze des Makros hinzu:

($x:ident ($($v:tt)*)) => { 
    struct_impl_my_features!(pub struct $x($($v)*);, $x) 
}; 

Und dann nannte es mag:

struct_impl_my_features!(MyTypedNumber(pub u32)); 
+0

Ich aktualisierte das zweite Makro Beispiel von dieser Frage nach der Anfrage verknüpft.Dennoch wäre die Fähigkeit, nach dem Definieren einer Struktur zu verwenden, nützlich, da es ein wenig umständlich ist, eine Strukturdefinition in ein Makro zu überführen. Die Frage wurde aktualisiert. – ideasman42

Verwandte Themen