2015-06-17 4 views
5

I gather, dass Rust bietet Debug impl's für Arrays Größe 32 und kleiner.Implementieren Debug-Eigenschaft für große Array-Typ

Ich auch gather, dass ich Debug auf einem größeren Array implementieren könnte, indem Sie einfach mit einem sehr langen Formatspezifizierer verwenden. Aber ich frage mich, ob es einen besseren Weg gibt.

Was ist die empfohlene Methode zur Implementierung von Debug für ein Array mit einer Länge von 1024?

+0

Ich würde sagen, das hängt ganz von Ihrem Anwendungsfall ab. Ich hatte Fälle, in denen ich den letzten Wert meiner Daten sehen musste. Manchmal reicht es aus, einige Statistiken über die Daten zu schreiben. Schließlich sind es Ihre Daten. – llogiq

+0

Guter Punkt. Und während ich auf eine Antwort warte, mache ich genau das und drucke ein paar wichtige Informationen aus. Aber ich bin immer noch neugierig, ob es eine gute Möglichkeit gibt, das gesamte Array zu drucken. – user12341234

+3

brauchst du nicht ein sehr langes Format - jedes Array ist als Slice bedruckbar – bluss

Antwort

7
use std::fmt; 

struct Array<T> { 
    data: [T; 1024] 
} 

impl<T: fmt::Debug> fmt::Debug for Array<T> { 
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 
     self.data[..].fmt(formatter) 
    } 
} 

fn main() { 
    let array = Array { data: [0u8; 1024] }; 

    println!("{:?}", array); 
} 

Es ist nicht möglich Debug für [T zu implementieren; 1024] oder ein Array eines konkreten Typs (z. B. [u8; 1024]. Das Implementieren von Merkmalen aus anderen Kisten für Typen aus anderen Kisten oder das Implementieren eines Merkmals aus einer anderen Kiste für einen generischen Typ sind beide nicht zulässig,

+0

Interessante Design-Wahl, ist die rationale Dokumentation überall? Wie auch immer, danke für die Antwort, es ist sicherlich akzeptabel angesichts der Umstände . – user12341234

+2

@ user12341234: Dies ist bekannt als "Kohärenzregeln", und die Begründung ist zu garantieren, dass, wenn Sie den Impl von "Trait" für "Struct" verwenden, Sie immer das gleiche Verhalten haben, unabhängig davon, welche Module/Kisten Sie verknüpft sind mit, denn alles andere ist überraschend. Es gab verschiedene Vorschläge, um diese Regeln in mancher Hinsicht zu lockern, aber das Rust-Team ist sehr darauf bedacht, Fußflinten zu vermeiden. –