Преобразование & I32 в F64 - PullRequest
1 голос
/ 09 марта 2019

Я новичок в ржавчине. Попытка выполнить упражнение в конце этой главы: https://doc.rust -lang.org / book / ch08-03-hash-maps.html

Вот пример кода:

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));
}

Ошибка:

error[E0277]: the trait bound `f64: std::convert::From<&i32>` is not satisfied

Я также пытался использовать ключевое слово "as", но это не помогло.

1 Ответ

4 голосов
/ 09 марта 2019

f64 только реализует From для i32, а не &i32 (что является ссылкой на 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
}

То же самое применимо, если вы попытаетесь сделать 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...