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

在学习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(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)