如何避免repr透明包装的孤立规则



我的问题是我想要一个透明的包装器并为它实现Into<underlying>。不幸的是,rust的孤立规则禁止它。下面是一个简单的例子:

#[repr(transparent)]
pub struct MyWrapper<T>(pub T);
impl<T> Into<T> for MyWrapper<T> {
fn into(self) -> T {
self.0
}
}

问题是我有什么办法可以实现它吗?我正在使用宏为我目前使用的所有类型生成impl,但它看起来非常尴尬和肮脏。

您可以实现Deref特性。Deref文档包含以下与您的代码几乎相同的示例:

use std::ops::Deref;
struct DerefExample<T> {
value: T
}
impl<T> Deref for DerefExample<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
fn main() {
let x = DerefExample { value: 'a' };
assert_eq!('a', *x);
}

您可以在常规impl块中实现它:

#[repr(transparent)]
pub struct MyWrapper<T>(pub T);
impl<T> MyWrapper<T> {
pub fn into(self) -> T {
self.0
}
}
fn main() {
let wrapped : MyWrapper<f32> = MyWrapper::<f32>(3.4f32);
let unwrapped : f32 = wrapped.into();
println!("{}", unwrapped);
}

最新更新