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

Ale*_*kiy 5 rust

我的问题是我想要一个透明的包装器并Into<underlying>为其实现。不幸的是,Rust 的孤儿规则禁止这样做。这是一个简单的例子:

#[repr(transparent)]
pub struct MyWrapper<T>(pub T);

impl<T> Into<T> for MyWrapper<T> {
    fn into(self) -> T {
        self.0
    }
}
Run Code Online (Sandbox Code Playgroud)

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

hkB*_*Bst 1

您可以改为实现 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);
}
Run Code Online (Sandbox Code Playgroud)