syntax - 如何编写更通用的 IntoIter 函数
问题描述
我正在阅读 stackoverflow 问题的答案,并尝试修改函数history
以获取IntoIter
item 可以是任何可以转换为参考并且Debug
在这种情况下具有一些特征的东西。
如果我V: ?Sized
从函数定义中删除,rust 编译器会抱怨它不知道str
编译时的大小。
use std::fmt::Debug;
pub fn history<I: IntoIterator, V: ?Sized>(i: I) where I::Item: AsRef<V>, V: Debug {
for s in i {
println!("{:?}", s.as_ref());
}
}
fn main() {
history::<_, str>(&["st", "t", "u"]);
}
我不明白为什么编译器首先会显示错误,并且如果我用V: ?Sized
.
解决方案
我有点欺骗
V: ?Sized
这不是作弊。Sized
默认情况下假定所有通用参数。这个默认值存在是因为它是最常见的情况——没有它,几乎每个类型参数都必须用: Sized
.
在您的情况下,V
只能通过引用访问,所以它不需要是Sized
. 放宽Sized
约束使您的函数尽可能通用,允许它与最可能的类型一起使用。
类型str
没有大小,所以这不仅仅是泛化,你实际上需要放宽默认Sized
约束才能使用你的函数str
。
推荐阅读
- javascript - 隐藏后div不显示
- android - 适用于 Android 的 Firebase 数据库
- c# - 实体框架 6 - 检索模型命名空间
- python-3.x - Flask 应用程序 Amazon Elastic Beanstalk 无法作为 python 模块加载
- go - 使用 vendored 导入模拟接口
- python - 神经网络 - ValueError:无法输入形状的值
- angular - Angular 6 不是函数异常
- javascript - 将多个数组合并为一个数组
- python - 无法获取heroku procfile
- google-cloud-platform - 压缩谷歌云存储桶中的目录,然后下载到本地目录