2016-08-04 39 views
2

Ich habe einen Vektor mit einem add Betreiber:Möglich, auf allen Mitgliedern einer homogenen Struktur/Tupel in Rust zu operieren?

use std::ops::Add; 

struct float2(f64, f64); 

impl Add for float2 { 
    type Output = float2; 

    fn add(self, _rhs: float2) -> float2 { 
     float2(self.0 + _rhs.0, 
       self.1 + _rhs.1) 
    } 
} 

Ist es möglich, dies so zu schreiben, dass es auch für ein 3D- oder 4D-Vektor funktionieren würde?

z.B .: struct float2(f64, f64, f64);

ich es geschafft, einen Index Operator hinzuzufügen, und eine len Methode, die einen statischen Wert für jeden Typ gibt, aber das fühlt sich ein bisschen umständlich. Ich habe die Assembly nicht überprüft, aber ihre möglichen Indexzugriffe werden überprüft, was für einen solchen Low-Level-Betrieb unnötig erscheint.

Ich könnte auch die Struktur packen und direkten unsicheren Speicherzugriff verwenden, aber das scheint auch nicht sehr optimal.

Gibt es eine bequemere Möglichkeit, Ausdrücke zu schreiben, die alle Elemente der Struktur behandeln?

Antwort

2

Nein, das ist nicht möglich. Möglich ist das Schreiben von Code, der den benötigten Code schreibt. Dies ist bekannt als metaprogramming. In Rust gibt es zwei Hauptwege für die Metaprogrammierung: Build-Skripte und Makros. Compiler Plugins existieren auch, sind aber viel komplizierter.

Die Rust-Standardbibliothek verwendet Makros, um Eigenschaften für Arrays und Tupel von 0 bis 32 zu implementieren, also ist es sicherlich ein akzeptiertes Muster. Sie sollten mit dem Schreiben einiger Fälle beginnen, um zu sehen, wie sich jede Iteration unterscheidet, und dann ein Makro daraus extrahieren.

Weiterführende Literatur: