如何将 &i32 转换为 f64?

Art*_*nau 5 rust

我正在尝试解决Rust Book 本章末尾的一个练习

这是一个代码示例:

fn mean(v: &Vec<i32>) -> f64 {
    let mut sum = 0.0;
    let mut count = 0.0;

    for val in v {
        sum += &f64::from(val);
        count += 1.0;
    }

    sum / count
}

fn main() {
    let v = vec![1, 2, 3, 4];

    println!("The mean is {}", mean(&v));
}
Run Code Online (Sandbox Code Playgroud)

错误是:

fn mean(v: &Vec<i32>) -> f64 {
    let mut sum = 0.0;
    let mut count = 0.0;

    for val in v {
        sum += &f64::from(val);
        count += 1.0;
    }

    sum / count
}

fn main() {
    let v = vec![1, 2, 3, 4];

    println!("The mean is {}", mean(&v));
}
Run Code Online (Sandbox Code Playgroud)

我也尝试使用as关键字,但没有帮助。

Joe*_*lay 11

f64实现Fromfori32, not &i32(这是对 an 的引用i32)。要使其正常工作,您需要取消引用val.

fn mean(v: &Vec<i32>) -> f64 {
    let mut sum = 0.0;
    let mut count = 0.0;

    for val in v {
        sum += f64::from(*val);
        count += 1.0;
    }

    sum / count
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试这样做val as f64,这同样适用,事实上,在这种情况下,您会收到更有帮助的错误消息:

error[E0606]: casting `&i32` as `f64` is invalid
 --> src/main.rs:6:16
  |
6 |         sum += val as f64;
  |                ---^^^^^^^
  |                |
  |                cannot cast `&i32` as `f64`
  |                help: dereference the expression: `*val`
Run Code Online (Sandbox Code Playgroud)