generics - 接受必须是引用的泛型类型的函数的惯用类型签名是什么?
问题描述
#[allow(dead_code)]
fn contains<'a, V, T, Q>(arr: V, value: &Q) -> bool
where
T: 'a + std::cmp::PartialEq<Q>,
V: std::iter::IntoIterator<Item = &'a T>,
{
arr.into_iter().any(|v| v == value)
}
#[test]
fn test_contains_hash_set() {
use std::collections::HashSet;
let hs_str: HashSet<&str> = ["a", "b", "c"].iter().copied().collect();
let hs_string: HashSet<String> = vec!["a".to_string(), "b".to_string(), "c".to_string()]
.into_iter()
.collect();
let value_str = "b";
let value_string = String::from(value_str);
assert!(contains(&hs_str, &value_string));
assert!(contains(&hs_string, &value_str));
assert!(contains(&hs_string, &"a"));
}
#[test]
fn test_contains_vec() {
let array_str = ["a", "b", "c"];
let array_string = ["a".to_string(), "b".to_string(), "c".to_string()];
let value_str = "b";
let value_string = String::from(value_str);
assert!(contains(&array_str, &value_string));
assert!(contains(&array_string, &value_str));
assert!(contains(&array_string, &"b"));
//assert!(contains(array_string, &"b"));
// ^^^ testing the compiler error for when there is no &
}
(游乐场)
忽略该声明,我可以阅读aswhere
的类型签名。我会假设,不管是什么,它都是一种将被移动的具体类型。contains
contains(V, &Q) -> bool
V
包括where
语句,V
成为对可以变成&T
s 的迭代器的东西的引用。根据我之前的假设,我想V
变成&V
; 但是它不会编译,因为它成为对某物的引用的引用。
如果另一个开发人员不知道std::iter::IntoIterator<Item = &'a T>
是如何实现的,他们会认为V
是移动的具体类型吗?有什么方法可以在V
期望引用的类型签名中显示?
V
不期待参考。V
恰好是您使用它的所有地方的参考,但不一定是。
正如函数contains
类型签名所代表的那样,它可以以更惯用的方式编写吗?
解决方案
推荐阅读
- java - 使用 Gson 将嵌套的 JSON 映射到 Java 类
- matlab - 替换不同类型数据时表字段位数变化
- javascript - 提交和页面加载后如何执行功能
- javascript - 使用 addEventListener 时出现类型错误
- docker - “docker-compose up”构建失败,命令“/bin/sh -c pipenv install”返回非零代码:1
- javascript - 如何创建一个每个数字都作为 JavaScript 键值的对象?
- python - Firebase 中缺少客户端标识符?
- ruby-on-rails - 在 ruby on rails 5.2.3 中递归添加 7 天的最佳方法是什么
- twilio - Twilio Programmable Chat 的“订阅频道”是什么意思
- javascript - 如何制作可重用的 vue js 组件?