rust语言学习笔记Trait之Debug、Display

Debug 开发者调试

  • Debug 用于调试输出,紧凑输出:{:?}、美化输出:{:#?}
  • 通常自动派生:#[derive(Debug)]
  • 自动派生时输出字段名、完整结构信息,也可以手动实现:impl std::fmt::Debug
  • 用于:日志记录、单元测试、开发阶段打印变量
  • 注意:由于 Debug 自动派生时输出包含所有字段,‌切勿 ‌在 Debug 输出中包含密码、密钥等敏感信息,或者在手动实现时将其掩码处理。

Display 用户展示

  • Display 用于自定义用户输出:{}

  • 必须手动实现:impl std::fmt::Display

  • 输出简洁、友好、正式,旨在让最终用户易读

  • 用于:CLI 工具输出、API 响应、错误提示消息

Debug 使用

Debug自动派生

rust 复制代码
#[derive(Debug)]     // 自动实现 Debug
struct User {
    id: usize,
    username: String,
    password: String,
}

fn main() {
    let user = User{id:1,username:"xiao".to_string(),password:"abc123".to_string()};
    println!("{:?}",user);    // 调试输出紧凑模式
    println!("{:#?}",user);   // 调试输出美化模式
}

程序输出:

bash 复制代码
# {:?}   调试输出紧凑模式
User { id: 1, username: "xiao", password: "abc123" }

# {:#?}  调试输出美化模式
User {
    id: 1,
    username: "xiao",
    password: "abc123",
}

Debug 手动实现 impl std::fmt::Debug(未区分美化模式)

rust 复制代码
use std::fmt;

struct User {
    id: usize,
    username: String,
    password: String,
}

impl fmt::Debug for User {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "User{{id={},username={}}}",self.id, self.username )
    }
}

fn main() {
    let user = User{id:1,username:"xiao".to_string(),password:"abc123".to_string()};
    println!("{:?}",user);    // 调试输出紧凑模式
    println!("{:#?}",user);   // 调试输出美化模式
}

程序输出:

bash 复制代码
# {:?}   调试输出紧凑模式
User{id=1,username="xiao"}

# {:#?}  调试输出美化模式
User{id=1,username="xiao"}

Debug 手动实现 impl std::fmt::Debug(区分美化模式)

rust 复制代码
use std::fmt;

struct User {
    id: usize,
    username: String,
    password: String,
}

impl fmt::Debug for User {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        if f.alternate(){
            // 当使用 {:#?} 时,f.alternate() 为 true
            write!(f, "User{{\n    id={},\n    username={}\n}}",self.id, self.username )
        }else{
            // 当使用 {:?} 时,f.alternate() 为 false
            write!(f, "User{{id={},username={}}}",self.id, self.username )
        }
    }
}

fn main() {
    let user = User{id:1,username:"xiao".to_string(),password:"abc123".to_string()};
    println!("{:?}",user);    // 调试输出紧凑模式
    println!("{:#?}",user);   // 调试输出美化模式
}

程序输出:

bash 复制代码
# {:?}   调试输出紧凑模式
User{id=1,username="xiao"}

# {:#?}  调试输出美化模式
User{
    id=1,
    username="xiao"
}

Display 的使用

rust 复制代码
use std::fmt;

#[derive(Debug)]   // 实现 Display 不影响 Debug 的使用
struct User {
    id: usize,
    username: String,
    password: String,
}

// Display 必须手动实现
impl fmt::Display for User {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "您的id:{},您的用户名:{}",self.id, self.username )
    }
}

fn main() {
    let user = User{id:1,username:"xiao".to_string(),password:"abc123".to_string()};
    println!("{:?}",user);    // Debug 调试输出紧凑模式
    println!("{:#?}",user);   // Debug 调试输出美化模式
    
    // 实现 Display 的输出
    println!("{}",user);
}

程序输出:

bash 复制代码
# {:?}   Debug 调试输出紧凑模式
User { id: 1, username: "xiao", password: "abc123" }

# {:#?}  Debug 调试输出美化模式
User {
    id: 1,
    username: "xiao",
    password: "abc123",
}

# {}  Display 的输出
您的id:1,您的用户名:abc123
相关推荐
大卫小东(Sheldon)13 小时前
Rust 推荐使用宏而非普通函数的场景
rust
doiito13 小时前
【Agent Harness】为什么我把 JSON‑LD “编译成 DAG” 后,整个 Agent 平台立刻聪明了
ai·rust·架构设计·系统设计·ai agent
jump_jump16 小时前
为了重玩金庸群侠传,我研究了一下 Ruffle 怎么复活 Flash
游戏·rust·github
LinXunFeng1 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
星栈2 天前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
Rust研习社3 天前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
红尘散仙4 天前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
vivo互联网技术4 天前
从 Web 到桌面:基于 Tauri 2.0 + Vue 3 打造 vivo 线下门店「大头贴」拍照体验系统
前端·rust
Rust研习社5 天前
这 8 个 Rust 学习资源值得每个新手收藏起来
后端·rust·编程语言
通信小呆呆5 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人