generics - 为什么即使泛型类型具有特征绑定,在对泛型类型的引用上也找不到方法?
问题描述
我有一个功能:
fn take_iter<
LABEL: std::fmt::Debug,
DATA: std::fmt::Debug,
SAMPLE: IntoIterator<Item = DATA>,
I: Iterator<Item = (SAMPLE, LABEL)>,
>(
iter: I,
) {
for (sample, label) in iter {
print!("sample {:.?}: ", label);
for val in sample {
print!("{:.?} ", val);
}
println!();
}
}
示例用法:
let a: Vec<(Vec<u8>, u16)> = vec![(vec![1, 2, 3, 4], 2), (vec![1, 2, 3, 4], 4)];
take_iter(a.into_iter());
印刷:
sample 2: 1 2 3 4
sample 4: 1 2 3 4
我的目标是调整此函数以通过引用而不是按值获取值:
let a: Vec<(Vec<u8>, u16)> = vec![(vec![1, 2, 3, 4], 2), (vec![1, 2, 3, 4], 4)];
take_iter(a.iter());
我目前的尝试(Rust playground)是:
fn take_iter<
LABEL: std::fmt::Debug,
DATA: std::fmt::Debug,
SAMPLE: IntoIterator<Item = DATA>,
K: std::ops::Deref<Target = (SAMPLE, LABEL)>,
I: Iterator<Item = K>,
>(
iter: I,
) {
for t in iter {
let (sample, label) = &*t;
print!("sample {:.?}: ", label);
for val in sample.iter() {
print!("{:.?} ", val);
}
println!();
}
}
这给出了错误:
error[E0599]: no method named `iter` found for reference `&SAMPLE` in the current scope
--> src/main.rs:30:27
|
30 | for val in sample.iter() {
| ^^^^ method not found in `&SAMPLE`
我在这里做错了什么?
解决方案
IntoIterator
trait 只有into_iter()
方法,没有iter()
. 此外,您必须以拥有的价值而不是参考来称呼它。
在通用代码中,您只能调用函数所需的特征的方法,而不能调用其他任何方法,因此Vec
具有.iter()
.
推荐阅读
- php - codeigniter godaddy 电子邮件 ssl
- conv-neural-network - 如何预处理“猫对狗”Tensorflow 数据集以便在 CNN 中处理它?
- php - 是否有数学计算可以通过谷歌的 Elevation API 来定义点 A 和点 B 之间是否存在可见性?
- mongodb - 具有两个字段匹配的 Mongo 聚合
- nginx - 直接访问 URL 导致在 Nginx 服务器上找不到 404 页面
- flutter - 颤振本地通知图标未显示
- python - 在 python 中,我想使用连接函数,但出现错误:"TypeError: 'builtin_function_or_method' object is not subscriptable"
- php - Yii2:对会话超时执行操作
- javascript - vuejs2 splice 仅删除最后一个元素
- java - 使用 Spring Boot @Configuraion 和 @Value 初始化 javafx 的 TextField 的默认值