rust - 我可以用来允许访问集合的中间元素的最一般特征是什么?
问题描述
我有一个辅助函数可以找到向量中的中间元素:
fn get_middle<T>(elements: Vec<T>) -> T {
elements[elements.len() / 2]
}
这允许我们像这样使用我们的助手:
get_middle(vec![1, 2, 3])
还有其他结构也可索引并具有长度。通过仅使用Vec<T>
. 例如,Range
s 不能被传入。也不能像向量一样自定义数据类型。
我可以用来约束的最一般的特征是什么elements
,它允许以下内容:
get_middle(vec![1, 2, 3])
// as well as...
get_middle(0..3)
我记得读过可以将范围转换为切片,但情况似乎并非如此。将类型更改为&[T]
给出错误,并尝试通过强制转换来遵循其建议<&[T]>::from(0..3)
似乎不起作用。查看Range
and的文档Vec
,似乎该Index
特征是我想要的一半,但似乎没有len()
.
解决方案
你想要ExactSizeIterator
: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));
}
请注意,nth
如果迭代器的源支持它(例如,切片或范围),则它被实现为随机访问。
推荐阅读
- javascript - Firebase Auth Google 登录问题
- terraform - Terraform:使用动态创建的相应 iam_policies 映射现有 iam_roles
- xcode - 我想根据项目 URL 更改行为
- c - VS Code 中 includePath 的问题(C)
- arrays - 比较两个数组元素的问题
- python - 如何突出显示和格式化给定的列?
- java - 类 HttpURLConnection 在 Android Studio 中不起作用
- python - pandas.errors.ParserError:使用之前没有出错的数据标记数据时出错
- uwp - 构建上传失败(有效负载包含两个或多个具有相同目标路径的文件)
- node.js - 无法使用 localhost 访问本地服务器,但可以通过 IP 工作