Rust の標準ライブラリにおける表示可能な型

RustRustBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、std::fmt のフォーマット特性を使用するには、型が表示可能な実装を持っている必要があることが説明されています。これは、std ライブラリ内の型には自動的に提供されます。他の型の場合、fmt::Debug 特性を派生させることで表示を可能にすることができます。fmt::Debug 特性は、表示可能な型の実装を簡単にする一方、fmt::Display は手動で実装する必要があります。fmt::Debug 特性はすべての型に表示用の実装を派生させることができ、std ライブラリの型に対する {:?} も同様です。この実験ではまた、{:?} を使用した表示の方法も触れられており、さまざまな型を表示するための使用例が示されています。さらに、{:#?} による「見やすい表示」の概念が導入され、これはデータ構造のよりエレガントな表現を提供します。最後に、fmt::Display を手動で実装することで型の表示を制御できることが述べられています。

注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、main.rs を使用して、rustc main.rs &&./main でコンパイルして実行することができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} rust/integer_types -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} rust/string_type -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} rust/function_syntax -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} rust/expressions_statements -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} rust/lifetime_specifiers -.-> lab-99187{{"Rust の標準ライブラリにおける表示可能な型"}} end

Debug

std::fmt のフォーマット 特性 を使用したいすべての型は、表示可能な実装が必要です。自動実装は、std ライブラリのような型にのみ提供されます。その他のすべての型は、何らかの方法で手動で実装する必要があります。

fmt::Debug 特性 はこれを非常に簡単にします。すべての型は、fmt::Debug の実装を 派生(自動的に作成)できます。これは、手動で実装する必要がある fmt::Display には当てはまりません。

// この構造体は、`fmt::Display` でも `fmt::Debug` でも表示できません。
struct UnPrintable(i32);

// `derive` 属性は、この `構造体` を `fmt::Debug` で表示可能にするために必要な実装を自動的に作成します。
#[derive(Debug)]
struct DebugPrintable(i32);

すべての std ライブラリの型も、{:?} で自動的に表示可能です:

// `Structure` に対して `fmt::Debug` の実装を派生させます。`Structure` は、1つの `i32` を含む構造体です。
#[derive(Debug)]
struct Structure(i32);

// `Deep` という構造体の中に `Structure` を入れます。これも表示可能にします。
#[derive(Debug)]
struct Deep(Structure);

fn main() {
    // `{:?}` を使った表示は、`{}` を使った場合と似ています。
    println!("{:?} months in a year.", 12);
    println!("{1:?} {0:?} is the {actor:?} name.",
             "Slater",
             "Christian",
             actor="actor's");

    // `Structure` は表示可能です!
    println!("Now {:?} will print!", Structure(3));

    // `derive` の問題は、結果の見た目を制御できないことです。もし私がこれがただの `7` を表示したいのであればどうすればいいでしょうか?
    println!("Now {:?} will print!", Deep(Structure(7)));
}

ですから、fmt::Debug は確かにこれを表示可能にしますが、ある程度のエレガンスを犠牲にします。Rust はまた、{:#?} を使った「見やすい表示」も提供しています。

#[derive(Debug)]
struct Person<'a> {
    name: &'a str,
    age: u8
}

fn main() {
    let name = "Peter";
    let age = 27;
    let peter = Person { name, age };

    // 見やすい表示
    println!("{:#?}", peter);
}

表示を制御するために、fmt::Display を手動で実装することができます。

まとめ

おめでとうございます!あなたは Debug 実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を練習することができます。