2015-05-23 1 views
9

Ein fester Länge Array eines nativen Typ (oder von einem Typ, der das Merkmal implementiert Copy) kann auf die Länge 32, die bis in Rust geklont werden soll, diese kompiliert:Wie klont man ein Array mit einer Länge größer als 32?

fn main() { 
    let source: [i32; 32] = [0; 32]; // length 32 
    let _cloned = source.clone(); 
} 

Aber dieses doesn ‚t:

fn main() { 
    let source: [i32; 33] = [0; 33]; // length 33 
    let _cloned = source.clone(); // <-- compile error 
} 

In der Tat erklärt die trait Clone nur eine Methode für jede generische Arraylänge von 0 bis 32.

Was eine effiziente und idiomatische Weise ist eine allgemeine Anordnung von Länge zu klonen, sagen , 33?

+0

Gibt es einen Grund, dass Sie in diesem Fall kein 'Vec' verwenden können? – Shepmaster

+2

Für alle anderen, die "WTF" gehen, [hier ist die Implementierung] (https://github.com/rust-lang/rust/blob/1.0.0/src/libcore/array.rs#L41) – remram

Antwort

7

Sie können die impl Clone nicht in Ihrem eigenen Code hinzufügen. Dieses Problem wird zu einem bestimmten Zeitpunkt festgelegt werden, in der Zwischenzeit Sie meist um es mit unterschiedlichem Aufwand arbeiten können:

  • Wenn Sie nur eine lokale Variable eines konkreten Typs haben und der Typ ist Copy (wie in Ihr Beispiel), können Sie einfach kopieren anstatt Klonen, dh let _cloned = source;.
  • Wenn das Array ein Feld einer Struktur ist, die Sie implementieren wollen Clone (und derive wird nicht funktionieren), können Sie immer noch Clone manuell implementieren und den obigen Trick in der Implementierung verwenden.
  • Klonen eines Arrays von nicht Copy Typen ist komplizierter, weil Clone kann fehlschlagen. Sie könnten [x[0].clone(), x[1].clone(), ...] für so viele Male schreiben, wie Sie brauchen, es ist eine Menge Arbeit, aber zumindest ist es sicher, dass es korrekt ist.
  • Wenn alles andere fehlschlägt, können Sie immer noch einen neuen Wrapper erstellen. Dies erfordert einiges an Vortex, um alle anderen Merkmale, die Sie benötigen, zu delegieren, aber dann können Sie (wiederum manuell) Clone implementieren.
Verwandte Themen