gpt4 book ai didi

syntax - 如何编写更通用的 IntoIter 函数

转载 作者:行者123 更新时间:2023-11-29 08:26:19 26 4
gpt4 key购买 nike

我正在阅读 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 作弊程序为什么能正常工作。

最佳答案

I kind of cheat with V: ?Sized

这不是作弊。默认情况下,假定所有通用参数都是 Sized。存在此默认值是因为它是最常见的情况 - 没有它,几乎每个类型参数都必须使用 : Sized 进行注释。

在您的情况下,V 只能通过引用访问,因此不需要Sized。放宽 Sized 约束可使您的函数尽可能通用,从而允许它与大多数可能的类型一起使用。

str 类型没有调整大小,所以这不仅仅是泛化,您实际上需要放宽默认的 Sized 约束才能将您的函数与 str.

关于syntax - 如何编写更通用的 IntoIter 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56727675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com