递归 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);
}
问题是如果元组的元素是参数,这个技巧就不起作用:
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);
}
该解决方案的局限性在于它不允许获取 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 论坛上。
有一个技巧可以定义递归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);
}
该解决方案的局限性在于它不允许获取 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 论坛上。