递归 来自 用于元组单< 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);
}

游乐场

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

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);
}

游乐场

解决方案的限制是它不允许从工作中获得深度参考。这行不通:

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

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

在第二种情况下,不可能使用单个Trait。为每个关卡实现一个trait是可能的:

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

虽然它不是递归的

Rust论坛的相关讨论

最新更新