迭代i32的矢量给出& i32

时间:2018-02-26 10:08:57

标签: vector reference rust mapping

我正在尝试一些简单的编码挑战来学习Rust。以下程序试图评分学生的分数。 以下是我的代码:

use std::io;

fn main() {
    let mut in0 = String::new();
    io::stdin().read_line(&mut in0).expect("stdin err");
    let n: i32 = in0.trim().parse().expect("parse err");
    println!("{}", n);
    let mut v: Vec<i32> = Vec::new();
    for _ in 0 .. n {
        let mut inp = String::new();
        io::stdin().read_line(&mut inp).expect("stdin err");
        let num: i32 = inp.trim().parse().unwrap();
        v.push(num);
    }
    let out: Vec<_> = v.iter().map(|x| {
        if x < 38 {
            x
        } else if x % 5 > 3 {
            x + x % 5
        } else {
            x
        }
    }).collect();
    println!("{:?}", v);
}

编译时,我收到以下错误。

error[E0308]: mismatched types
  --> src/main.rs:16:16
   |
16 |         if x < 38 {
   |                ^^ expected &i32, found integral variable

x变量如何&i32类型而不是i32类型?

1 个答案:

答案 0 :(得分:1)

如果您要使用Vec,则必须使用into_iter()方法:

use std::io;

fn main() {
    let mut in0 = String::new();
    io::stdin().read_line(&mut in0).expect("stdin err");
    let n: i32 = in0.trim().parse().expect("parse err");
    println!("{}", n);
    let mut v: Vec<i32> = Vec::new();
    for _ in 0 .. n {
        let mut inp = String::new();
        io::stdin().read_line(&mut inp).expect("stdin err");
        let num: i32 = inp.trim().parse().unwrap();
        v.push(num);
    }
    let out: Vec<_> = v.into_iter().map(|x| {
        if x < 38 {
            x
        } else if x % 5 > 3 {
            x + x % 5
        } else {
            x
        }
    }).collect();
    println!("{:?}", out);
}

如果你不使用矢量,它里面的东西只能借用而不能移动。