18

今日の Rust nightly では、次のコードはコンパイルされなくなりました。

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

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

代わりに、次のエラー メッセージが表示されます。

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

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

4

2 に答える 2

38

古いShow特性は と に分割されましDisplayDebug

  • Displayユーザー向けの出力用に設計されており、空白/デフォルトの書式指定子を使用します (例:{}すべて{:.10} {foo:}使用していますDisplay) 。

  • Debugデバッグ/内部出力用に設計されており、?フォーマット指定子を使用しています (例: {:?}{:.10?}{foo:?}すべて を使用していますDebug) 。

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

ほとんどの状況では、ような出力が正しいユーザー向け出力である可能性は低いため、dのみDebugが可能です (一部の場合はそうであると確信していますが、プログラマーは自分でそれを行うための実装を記述したり、直接呼び出すことさえできます) d実装) 。#[derive]Foo { x: 1, y: 2 }Display#[derive]Debug

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

于 2015-01-10T14:08:38.460 に答える
5

答えはin{:?}の代わりに使用することです。{}format!

于 2015-01-10T10:32:47.387 に答える