我需要这样的东西:
fn my_convert<T, U>(v: &Vec<U>)->Vec<T>{
v.iter().map(|&t|t).collect()
}
当然,我认为只有内置数字类型的向量才能传递给函数。
编译器告诉我,我需要为Vec提供FromIterator的trait
traitstd::iter::from迭代器
然后,我补充道
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
}
}
trait
std::iter::from迭代器的冲突实现
众所周知,在C语言中,这种转换是直接的、直观的。我是铁锈的初学者。我不知道如何定义上述函数。我甚至不知道这是否可以在锈菌中实现,因为泛型类型的特征非常复杂。
谢谢
匿名用户
来自的锈迹特征是你的一般目的“如何从A到B”。如果有一个合理的方法从U
到T
,那么T:from
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). Collection()
,任何相当熟练的Rust程序员都会立即知道您在做什么。
这里有一点需要注意,因为你已经提到你是一名C程序员。在C语言中,模板函数可以简单地按原样编写,然后,当调用方实例化模板函数的一个版本时,编译器会检查它是否正常。因此,您在OP中提出的函数运行良好,因为编译器只在调用它时检查它。Rust(事实上,大多数带有泛型的语言)不是这样的。
另一方面,在Rust中,当您编写my_convert
函数时,Rust会检查所有类型是否对齐。你不能编写一个只在某些时间有效的函数。如果你说my_convert
适用于所有T
和U
,那么它最好适用于所有这些,Rust的类型检查器和借阅检查器将立即验证这一点。如果没有,那么你最好像我上面做的那样,限制类型签名。如果你曾经使用过C 20,你可以认为特质在某种程度上类似于C 20中的“概念”特性。
我想转换一个
我对生锈编程是新手。我想用递归实现合并排序。这是我的代码: 问题是,当我试图编译它时,我得到了以下错误: 你知道我为什么会犯这个奇怪的错误吗!看来,我错过了什么。
我将springboot控制器与@RequestBody一起使用。我有以下json请求正文 我有一个对应的POJO 我有控制器就像 显然它不起作用,因为是请求中的字符串,而它在MyObject中是布尔值。我希望它有一个逻辑,所以如果在请求中,它将在MyObject中转换为布尔值。Spring有什么机制来实现这一点?
这里我将vec分割成大小相等的4个子向量,然后返回一个集合,我希望从集合中返回的类型是< code>Vec
给定以下示例代码 不可能将变量传递给函数,因为 类型为“MyInterface”的参数不可分配给类型为“Record”的参数 我通过转换变量解决了这个问题
我对大摇大摆的文档很陌生。我们有一个现有的项目正在为RESTFul Web服务开发进度语言。不同的基于资源的URL以Application/JSON格式使用和生成。下面给出了一个资源url的输入和输出json格式: 如何将上述请求和响应json格式转换为swagger 2.0 json格式? 谢了!