Я пытаюсь вычислить простые числа в Rust, но у меня есть некоторые проблемы. Я получил две ошибки. Я не понимаю, как значение возвращается к основной функции.

fn main() {
    let x = is_prime(25); //function calling
    println!("{}", x);
}

fn is_prime(n: u32) -> bool {
    let mut result: bool = for a in 2..n {
        result = if n % a == 0 { false } else { true };
    };
    result
}
error[E0425]: cannot find value `result` in this scope
 --> src/main.rs:8:9
  |
8 |         result = if n % a == 0 { false } else { true };
  |         ^^^^^^ not found in this scope
help: possible candidates are found in other modules, you can import them into scope
  |
1 | use futures::future::result;
  |
1 | use tokio::prelude::future::result;
  |

error[E0308]: mismatched types
 --> src/main.rs:7:28
  |
6 |   fn is_prime(n: u32) -> bool {
  |                          ---- expected `bool` because of return type
7 |       let mut result: bool = for a in 2..n {
  |  ____________________________^
8 | |         result = if n % a == 0 { false } else { true };
9 | |     };
  | |_____^ expected bool, found ()
  |
  = note: expected type `bool`
             found type `()`
1
Muhammad Areeb Siddiqui 22 Апр 2019 в 10:11

2 ответа

Лучший ответ

Проблема с вашим кодом в том, что вы используете переменную result при ее определении

...
let mut result: bool = for a in 2..n { // declared here
    result = if n % a == 0 { // used here, but it is still not initialized
...

Вы можете легко обойтись без переменной result, в этом нет необходимости:

fn is_prime(n: u32) -> bool {
    if n <= 1 {
        return false;
    }
    for a in 2..n {
        if n % a == 0 {
            return false; // if it is not the last statement you need to use `return`
        }
    }
    true // last value to return
}

Ссылка на игровую площадку

2
Netwave 11 Май 2020 в 17:51

У вас есть несколько проблем в вашем коде (игнорируя, что он не компилируется):

  • вы перезаписываете результат -> представьте n = 4. Когда вы делите на 2, вы получаете result = true, но в следующей итерации, когда вы делите на 3, вы получаете result = false
  • если n<=2 ваш цикл никогда не будет выполнен, следовательно, что будет в результате

Вместо того, чтобы пытаться использовать любой новый фрагмент синтаксиса, постарайтесь написать его так, чтобы он был максимально читабельным:

fn is_prime(n: u32) -> bool {
    let limit = (n as f64).sqrt() as u32;

    for i in 2..=limit {
        if n % i == 0 {
            return false;
        }
    }

    true
}
2
Svetlin Zarev 22 Апр 2019 в 14:42