gpt4 book ai didi

rust - 在 Rust 中,如何定义将 Vec 转换为 Vec 的通用函数

转载 作者:行者123 更新时间:2023-12-04 16:22:55 24 4
gpt4 key购买 nike

我需要类似的东西:

fn my_convert<T, U>(v: &Vec<U>)->Vec<T>{
v.iter().map(|&t|t).collect()
}
当然,我认为只能将内置数字类型的向量传递给函数。
编译器告诉我,我需要为 Vec 提供特性 FromIterator

the trait std::iter::FromIterator<U> is not implemented for `std::vec::Vec


然后,我补充说
impl<T, U> std::iter::FromIterator<U> for Vec<T>{
fn from_iter<I>(iter:I)->Self where I: IntoIterator<Item=U>{
Vec::<T>::new() // just for test
}
}

conflicting implementations of trait std::iter::FromIterator<_> for type std::vec::Vec<_>:note: conflicting implementation in crate alloc:- impl std::iter::FromIterator for std::vec::Vec;rustc(E0119)


众所周知,在 C++ 中,这种转换是直接而直观的。我是 Rust 的初学者。我不知道如何定义像上面这样的函数。由于泛型类型特征的复杂性,我什至不知道它是否可以在 Rust 中实现。
谢谢!

最佳答案

rust From trait 是你的通用目的“如何从 A 到 B”。如果有合理的方法可以从 U 开始至 T ,然后 T: From<U>将实现。考虑

fn my_convert<T, U>(v: Vec<U>) -> Vec<T>
where T: From<U> {
v.into_iter().map(T::from).collect()
}
请注意,我确实拥有 v 的所有权。向量。 From::from函数消耗它的参数,所以我们也应该消耗向量。您可以编写此函数的完全通用版本,该版本可与任意迭代器一起使用,然后在拥有数据的迭代器和仅借用数据的迭代器之间来回切换会更容易。
fn my_convert1<T, U, I>(v: I) -> Vec<T>
where T: From<U>,
I: Iterator<Item=U> {
v.map(T::from).collect()
}
但到那时,你最好只写 v.map(T::from).collect()直接,任何相当熟练的 Rust 程序员都会立即知道你在做什么。
这里要注意一点,因为您已经提到您是一名 C++ 程序员。在 C++ 中,模板函数可以简单地按原样编写,然后,当调用者实例化它的一个版本时,编译器会检查它是否正常。所以你在 OP 中提议的函数工作正常,因为编译器只在调用它时检查它。 Rust(实际上是大多数具有泛型的语言)不是这样的。
另一方面,在 Rust 中,当您编写 my_convert 时函数,Rust 会在那时检查所有类型是否对齐。你不能写一个只能在某些时候工作的函数。如果你说 my_convert适用于所有人 TU ,那么它对所有人都有更好的作用,Rust 的类型检查器和借用检查器将立即验证这一点。如果没有,那么你最好像我上面那样做并限制类型签名。如果您完全使用过 C++20,您可以认为 trait 有点类似于 C++20 中的“概念”特性。

关于rust - 在 Rust 中,如何定义将 Vec<T> 转换为 Vec<U> 的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70014181/

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