2015-01-10 11 views
14

毎晩、次のコードはもうコンパイルされません:#[派生(表示)]がもう機能しないのはなぜですか?今日のラストで

#[derive(Show)] 
enum S { 
    A, 
    B 
} 

fn main() { 
    println!("{}", S::A); 
} 

をする代わりに、それは私に次のエラーメッセージが得られます。

error: the trait `core::fmt::String` is not implemented for the type `S` 

を以前の動作を取得する方法はありますか?確かに、これを各タイプごとに手動で実装する必要はありません。

答えて

27

Show形質をDisplayDebugに分けた。

  • Displayユーザに面する出力のために設計され、ブランク/既定の形式指定子使用(例えば{}{:.10}{foo:}すべてDisplayを使用している)

  • Debugされ、デバッグ/内部出力および使用のために設計されています?書式指定(例えば{:?}{:.10?}{foo:?}はすべてDebugを使用している)

したがって、#[derive(Debug)]によって作成された実装を使用するには、古いprintln!("{}", ...)の代わりにprintln!("{:?}", ...)と記述する必要があります。

Foo { x: 1, y: 2 }のような出力がほとんどの状況のた​​めに、正しいユーザー向けの出力になることはほとんどありませんので、のみDebugは(私はそれはいくつかのためであると確信しているが、その後、プログラマが何をしDisplayの実装を書くことができます#[derive] Dすることができ自分自身、または#[derive]d Debug実装に直接電話することさえできます)。

これはもともとRFC 504に記述されており、進行中の議論はRFC 565にあり、上記のガイドラインをより具体的にしています。

5

Tshepangに感謝します。答えは{}の代わりに{:?}format!に使用することです。

+0

私は説明がないので、コメントがあります。 – Tshepang

+0

私にとっては十分です。 :) – ujh

関連する問題