递归 From 以供参考元组 Single< T >( T )?

Recursive From for reference on tuple Single< T >( T )?

有一个技巧可以定义递归From,供参考。像那样:

#[derive(Debug)]
struct Single(i32);

impl From<i32> for Single {
    fn from(src: i32) -> Self {
        Self(src)
    }
}

impl<T> From<&T> for Single
where
    T: Clone,
    Self: From<T>,
{
    fn from(src: &T) -> Self {
        From::from((*src).clone())
    }
}

fn main() {
    let a = Single::from(13);
    dbg!(&a);

    let a = Single::from(&13);
    dbg!(&a);

    let a = Single::from(&&13);
    dbg!(&a);
}

Playground

问题是如果元组的元素是参数,这个技巧就不起作用:

struct Single< E >( E );

原因是实施冲突。我得到的最好的是:

#[derive(Debug)]
struct Single<E>(E);

impl<E> From<E> for Single<E> {
    fn from(src: E) -> Self {
        Self(src)
    }
}

impl<E> From<&E> for Single<E>
where
    E: Clone,
    Self: From<E>,
{
    fn from(src: &E) -> Self {
        From::from((*src).clone())
    }
}

fn main() {
    let a: Single<i32> = Single::from(13);
    dbg!(&a);

    let a: Single<i32> = Single::from(&13);
    dbg!(&a);

    let a: Single<i32> = Single::from(&&13);
    dbg!(&a);
}

Playground

该解决方案的局限性在于它不允许获取 From working for deep reference。那行不通:

let a : Single< i32 > = Single::from( &&13 )

这是一个小限制,但我很好奇是否可以克服它?

在第二种情况下,无法使用单个 Trait。 可以为每个级别实现一个特征:

impl<E> From<&E> for Single<E>
impl<E> From<&&E> for Single<E>
impl<E> From<&&&E> for Single<E>

虽然不是递归的。

Related discussion 在 Rust 论坛上。