如何在 Rust 中打印未实现 Display 或 Debug 的私有类型变量?

问题描述 投票:0回答:1

假设我们有一个无法进行任何更改的私有库,其中包含一些未在库模块中公开的类型。

// lib.rs
mod inner {
    pub struct SecretData {
        value: u32,
    }

    impl SecretData {
        fn new(value: u32) -> Self {
            SecretData { value }
        }
    }

    pub fn create_secret() -> SecretData {
        SecretData::new(42)
    }
}

pub use inner::create_secret;

在我们的应用程序中,我们希望使用库提供的函数创建一个秘密,然后打印出该秘密。

// main.rs
use my_crate::create_secret;


fn main() {
    let secret = create_secret();
    println!("The secret is: {:?}", secret);
}

主函数中的上述代码将导致错误,表明 struct SecretData 尚未实现 Debug 特征。

有什么方法可以打印出

secret
的值吗?

rust private
1个回答
0
投票

因为您知道

SecretData
的结构,所以可以创建您自己的相同形状的结构和
transmute
您可访问的秘密结构
SpyData
:

pub struct SpyData {
    value: u32,
}

let secret = create_secret();
let spied: SpyData = unsafe { std::mem::transmute(secret) };
println!("{}", spied.value);  // 42
© www.soinside.com 2019 - 2024. All rights reserved.