Rust 为泛型类型向量的每个元素添加一个数字
在学习Rust的过程中,我尝试向向量的每个元素添加一个整数:Rust 为泛型类型向量的每个元素添加一个数字,rust,Rust,在学习Rust的过程中,我尝试向向量的每个元素添加一个整数: trait Arith: Copy { fn add(self, b: Self) -> Self; fn mult(self, b: Self) -> Self; fn print(self); } impl Arith for i32 { fn add(self, b: Self) -> Self { self + b } fn mult(sel
trait Arith: Copy {
fn add(self, b: Self) -> Self;
fn mult(self, b: Self) -> Self;
fn print(self);
}
impl Arith for i32 {
fn add(self, b: Self) -> Self {
self + b
}
fn mult(self, b: Self) -> Self {
self * b
}
fn print(self) {
println!("Val = {}", self);
}
}
fn vec_add<T: Arith>(vec: &mut Vec<T>) {
for e in vec.iter_mut(){
/* e is of type &mut i32. But you can give it to print() which
expects i32 because rust derefs it implicitly */
e.print();
e.add(5);
}
}
fn main() {
println!("Hello World");
let mut vec: Vec<i32> = vec![1,2,3,4,5];
vec_add(&mut vec);
}
trait Arith:复制{
fn添加(self,b:self)->self;
fn mult(self,b:self)->self;
fn打印(自我);
}
i32的impl算法{
fn添加(self,b:self)->self{
自我+b
}
fn mult(self,b:self)->self{
自我*b
}
fn打印(自我){
println!(“Val={}”,self);
}
}
fn向量添加(向量:&mut向量){
对于向量中的e.iter_mut(){
/*e的类型为&mut i32。但您可以将其交给print(),它
应为i32,因为rust会隐式解除它*/
e、 打印();
e、 增加(5);
}
}
fn main(){
println!(“你好世界”);
设mut-vec:vec=vec![1,2,3,4,5];
vec_添加(&mut vec);
}
但我面临以下问题:
<anon>:33:15: 33:16 error: mismatched types:
expected `T`,
found `_`
(expected type parameter,
found integral variable) [E0308]
<anon>:33 e.add(5);
:33:15:33:16错误:不匹配的类型:
应为'T`,
发现`_`
(应为类型参数,
已找到整数变量)[E0308]
:33 e.添加(5);
你能解释一下我在这里犯了什么错误吗?数字5是一个整数(我认为默认情况下它是i32
,或者可能是u32
,目前我不记得了)。类型T
,即泛型类型,可以是任何类型,因此一般来说,5不属于同一类型的T
。您可以强制T
为整数,也可以通过以下方式更改vec\u add
:
fn vec_add<T: Arith>(vec: &mut Vec<T>, val: T){
for e in vec.iter_mut(){
/* e is of type &mut i32. But you can give it to print() which
expects i32 because rust derefs it implicitly */
e.print();
e.add(val);
}
}
fn main(){
println!("Hello World");
let mut vec: Vec<i32> = vec![1,2,3,4,5];
vec_add(&mut vec, 5);
}
fn向量添加(向量:&mut向量,val:T){
对于向量中的e.iter_mut(){
/*e的类型为&mut i32。但您可以将其交给print(),它
应为i32,因为rust会隐式解除它*/
e、 打印();
e、 添加(val);
}
}
fn main(){
println!(“你好世界”);
设mut-vec:vec=vec![1,2,3,4,5];
vec_add(&mut-vec,5);
}
数字5是一个整数(我想默认情况下它是i32
,或者可能是u32
,现在我不记得了)。类型T
,即泛型类型,可以是任何类型,因此一般来说,5不属于同一类型的T
。您可以强制T
为整数,也可以通过以下方式更改vec\u add
:
fn vec_add<T: Arith>(vec: &mut Vec<T>, val: T){
for e in vec.iter_mut(){
/* e is of type &mut i32. But you can give it to print() which
expects i32 because rust derefs it implicitly */
e.print();
e.add(val);
}
}
fn main(){
println!("Hello World");
let mut vec: Vec<i32> = vec![1,2,3,4,5];
vec_add(&mut vec, 5);
}
fn向量添加(向量:&mut向量,val:T){
对于向量中的e.iter_mut(){
/*e的类型为&mut i32。但您可以将其交给print(),它
应为i32,因为rust会隐式解除它*/
e、 打印();
e、 添加(val);
}
}
fn main(){
println!(“你好世界”);
设mut-vec:vec=vec![1,2,3,4,5];
vec_add(&mut-vec,5);
}
因此在fn add(self,b:self)->self
中,self
属于vec\u add
上下文中的T
类型?因此在fn add(self,b:self)->self
中,self
属于vec\u add
上下文中的T类型?注:您确实知道e.add(5)
返回e+5
但不修改e
本身,对吗?是的。我把它改为*e=e.add(5)注意:你知道e.add(5)
返回e+5
,但不修改e
本身,对吗?是的。我把它改为*e=e.add(5)