我正在阅读关于stackoverflow问题的答案,并尝试修改函数history
以使用IntoIter
,其中item可以是任何可以转换为引用并具有某些特征Debug
的东西。这种情况。
如果我要从函数定义中删除V: ?Sized
,则锈编译器会抱怨说,它在编译时不知道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
作弊,为什么程序可以正常工作。
答案 0 :(得分:2)
我有点
V: ?Sized
作弊
这不是作弊。默认情况下,所有通用参数都假定为Sized
。存在该默认值是因为它是最常见的情况-没有它,几乎每个类型参数都必须用: Sized
注释。
在您的情况下,V
只能通过引用进行访问,因此不需要Sized
。放宽Sized
约束可使您的函数尽可能地通用,从而使其可用于大多数类型。
类型str
是无大小的,因此这不仅仅是泛化,实际上您需要放宽默认的Sized
约束,以便能够将功能与str
一起使用。