在 Rust 中,是否存在由任何类型 T 实现的特征,使得 t.clone() 产生 T?

问题描述 投票:0回答:1

假设我正在尝试创建一个类似的函数:

func(iterator: impl IntoIterator<Item = T>)

我认为这适用于

func(vec)
,但不适用于
func(&vec)
,这很好,但如果我希望它同时适用于两者呢?假设
T
实现
Copy
。所以我可以编写该函数的两个版本,

func_ref(iterator: impl IntoIterator<Item = &T>) {
    let vec = iterator.into_iter().map(|t| *t).collect::<Vec<_>>();
    // Code using vec
}

func_val(iterator: impl IntoIterator<Item = T>) {
    let vec = iterator.into_iter().collect::<Vec<_>>();
    // Code using vec
}

但是也许我还需要一个

&mut T
版本,感觉它应该能够适用于任何实现
Deref<Target = T>
的东西,但我想如果我尝试定义自己的特质,同时为
 实现T
impl Deref<Target = T>
,我将遇到理论上
T
可以实现
Deref<Target = T>
的问题,所以我不能有冲突的实现......所以我只是想知道是否有解决方案.

generics rust traits
1个回答
0
投票

正如@cafce25所评论的,你的问题标题的答案是

Clone
特征。从您的问题正文来看,您似乎确实在寻找
Borrow<T>
,它是为所有
T
&T
&mut T
实现的,并允许您获得
&T
,您可以那么
.clone()
如果
T
实现了
Clone
。你的函数将如下所示:

pub fn func<T: Clone> (iterator: impl IntoIterator<Item = impl Borrow<T>>) {
    let _vec = iterator.into_iter().map(|t| t.borrow().clone()).collect::<Vec<_>>();
    // Code using vec
    todo!();
}

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.