← Back to Rust Course | Chapter 11: Generics & Traits | Lesson 6 of 7

Display और Debug Traits

Display और Debug आपके type को खुद को readable text में बदलने के दो अलग तरीके सिखाते हैं: एक लोगों के लिए polished, एक developers के लिए detailed।
Syntax
rust
use std::fmt;

impl fmt::Display for Name {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.field)
    }
}

#[derive(Debug)]

Deriving Debug

#[derive(Debug)] अपने आप एक Debug implementation generate करता है, एक struct को quick developer-facing inspection के लिए {:?} से print होने देते हुए।

उदाहरण: Deriving Debug

markup
// Auto-generate #[derive(Debug)] for the type below
#[derive(Debug)]
// Define a struct `Point` to group related fields together
struct Point {
    x: i32,
    y: i32,
}

// Entry point: execution of the program starts here
fn main() {
    // Declare an immutable variable `p`, set to `Point { x: 1, y: 2 }`
    let p = Point { x: 1, y: 2 };
    // Print "{:?}" to the console, substituting in `p` (with a trailing newline)
    println!("{:?}", p);
}

Implementing Display Manually

Display में कोई automatic derive नहीं है और इसे हाथ से implement किया जाना चाहिए, बिल्कुल यह define करते हुए कि {} के ज़रिए clean, user-facing output में type कैसा दिखना चाहिए।

उदाहरण: Implementing Display Manually

markup
// Bring `std::fmt` into scope
use std::fmt;

// Define a struct `Point` to group related fields together
struct Point {
    x: i32,
    y: i32,
}

// Implement methods on `fmt`
impl fmt::Display for Point {
    // Define the function `fmt` taking `&self`, `f` and returning a `fmt::Result`
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

// Entry point: execution of the program starts here
fn main() {
    // Declare an immutable variable `p`, set to `Point { x: 3, y: 4 }`
    let p = Point { x: 3, y: 4 };
    // Print "{}" to the console, substituting in `p` (with a trailing newline)
    println!("{}", p);
}

Implementing Both Traits on the Same Type

एक type एक साथ Display और Debug दोनों implement कर सकता है, इसे दो distinct textual representations देते हुए इस आधार पर कि {} या {:?} उपयोग हुआ।

उदाहरण: Implementing Both Traits on the Same Type

markup
// Bring `std::fmt` into scope
use std::fmt;

// Auto-generate #[derive(Debug)] for the type below
#[derive(Debug)]
// Define a struct `Money` to group related fields together
struct Money {
    cents: i64,
}

// Implement methods on `fmt`
impl fmt::Display for Money {
    // Define the function `fmt` taking `&self`, `f` and returning a `fmt::Result`
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "${:.2}", self.cents as f64 / 100.0)
    }
}

// Entry point: execution of the program starts here
fn main() {
    // Declare an immutable variable `price`, set to `Money { cents: 1999 }`
    let price = Money { cents: 1999 };
    // Print "Display: {}" to the console, substituting in `price` (with a trailing newline)
    println!("Display: {}", price);
    // Print "Debug: {:?}" to the console, substituting in `price` (with a trailing newline)
    println!("Debug: {:?}", price);
}

Using write! Inside fmt

write! macro वह तरीका है जिससे Display और Debug implementations दोनों अपना output produce करते हैं, formatted text को दिए Formatter में लिखते हुए और एक fmt::Result return करते हुए।

उदाहरण: Using write! Inside fmt

markup
// Bring `std::fmt` into scope
use std::fmt;

// Define a struct `Temperature` to group related fields together
struct Temperature(f64);

// Implement methods on `fmt`
impl fmt::Display for Temperature {
    // Define the function `fmt` taking `&self`, `f` and returning a `fmt::Result`
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:.1} degrees", self.0)
    }
}

// Entry point: execution of the program starts here
fn main() {
    // Declare an immutable variable `t`, set to `Temperature(23.456)`
    let t = Temperature(23.456);
    // Print "{}" to the console, substituting in `t` (with a trailing newline)
    println!("{}", t);
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. #[derive(Display)] से Display derive करने की कोशिश करना -- Debug के विपरीत, Display में कोई built-in derive नहीं और इसे manually implement किया जाना चाहिए।
  2. Display implement करना लेकिन भूल जाना कि {:?} formatting काम करने के लिए Debug अलग से अब भी चाहिए।
  3. fmt से सीधे एक String return करना बजाय write!(f, ...) उपयोग करने के, जो Display/Debug output produce करने का सही तरीका है।
चैप्टर सारांश
  • Display ({}) को manually implement किया जाना चाहिए और यह clean, user-facing output के लिए है।
  • Debug ({:?}) #[derive(Debug)] से auto-derive हो सकता है और यह developer-facing diagnostics के लिए है।
  • दोनों traits को एक fmt method define करके implement किया जाता है जो write! macro उपयोग करके एक Formatter में लिखता है।
  • एक type एक साथ दोनों traits implement कर सकता है, {} versus {:?} के लिए अलग output प्रदान करते हुए।
🔒

Chapter Quiz — Complete all 7 topics to unlock

0/7 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.