定义了 From<T> 后,如何自动实现 From<&T>?

3

考虑以下 MRE(正则表达式):

struct A {}
struct B {}

impl From<A> for B {
    fn from(t: A) -> B { B {} }
}

是否有可能自动实现 From<&A> for B


2
听起来你想要 Clone?这将是从 &T 转换的更常规方式。 - kmdreko
2
“自动”是什么意思? - kmdreko
1
创建B:实现从<&A>转换为B,而不需要定义两次“from”。 - Test
2个回答

5
不行,您必须自己编写。
impl From<&A> for B {
    fn from(a: &A) -> B {
        unimplemented!("implement me")
    }
}
From 的唯一通用实现是 impl<T> From<T> for T(即恒等转换),没有可用于该特征的 #[derive] 宏(用于其他“自动”实现),也没有我知道的其他宏(尽管如果你真的想要,你可能可以轻松地制作一个)。

0
你想要的方向是不可能的。例如,考虑一个没有实现Clone的结构体Str,以及A=B=Str。然后有impl From<A> for B(也就是说,impl From<Str> for <Str>),但是你怎么能写出这样的代码呢?
fn from(t: &Str) -> Str

你需要哪些内容才能使用“impl From<&A> for B”呢?
反过来也是有一定道理的:如果你已经定义了“impl From<&A> for B”,那么你可以轻松地定义“impl From<A> for B”。
impl From<A> for B {
    fn from(t: A) -> B { From::from(&t) }
}

目前还没有内置的方法来做到这一点(正如kmdreko的回复所说),但这是可能的。

如果添加一个 A:Clone 的要求,这也是有道理的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接