我可以用来访问集合的中间元素的最一般特征是什么?

时间:2018-06-22 11:23:01

标签: rust traits

我有一个辅助函数,可在向量中找到中间元素:

fn get_middle<T>(elements: Vec<T>) -> T {
    elements[elements.len() / 2]
}

这使我们可以像这样使用助手:

get_middle(vec![1, 2, 3])

还有其他一些也可以索引并具有长度的结构。通过仅使用Vec<T>,我们确实缩小了此帮助程序的用途。例如,Range不能传入。行为像矢量的自定义数据类型也不能。

我可以用来约束elements使其具有以下特征的最一般特征是什么:

get_middle(vec![1, 2, 3])
// as well as...
get_middle(0..3)

我回想起阅读时可以将范围转换为切片的情况,但事实并非如此。将类型更改为&[T]会产生错误,尝试通过强制转换<&[T]>::from(0..3)来遵循其建议似乎无效。查看RangeVec的文档,似乎Index特质是我想要的一半,但似乎没有len()的特质

1 个答案:

答案 0 :(得分:4)

您想要ExactSizeIteratorlist<int> l unordered_map<int, list<int>::iterator> m;

IntoIterator

请注意,如果迭代器的源支持fn get_middle<T, U>(elements: U) -> Option<T> where U: IntoIterator<Item = T>, U::IntoIter: ExactSizeIterator, { let mut it = elements.into_iter(); let len = it.len(); it.nth(len / 2) } fn main() { assert_eq!(get_middle(vec![1, 2, 3]), Some(2)); assert_eq!(get_middle(0..3), Some(1)); } (例如,切片或范围),则会将其实现为随机访问。