假设我正在尝试创建一个类似的函数:
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>
的问题,所以我不能有冲突的实现......所以我只是想知道是否有解决方案.
正如@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!();
}