假设我们有一个无法进行任何更改的私有库,其中包含一些未在库模块中公开的类型。
// 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
的值吗?
因为您知道
SecretData
的结构,所以可以创建您自己的相同形状的结构和 transmute
您可访问的秘密结构 SpyData
:
pub struct SpyData {
value: u32,
}
let secret = create_secret();
let spied: SpyData = unsafe { std::mem::transmute(secret) };
println!("{}", spied.value); // 42