rustrust-result

# How do I return a Result data type in Rust?

I have the code below

``````fn main() {
let num: i64 = 600851475143;

println!("Largest prime: {}", largest_prime_factor(num));

}

fn largest_prime_factor(num:i64) -> Result<i64, Error<None>> {
let mut primes: Vec<i64> = Vec::new();

for x in 1i64..=num {
if num % x == 0 {
if (x == 2) | (x==3) | ((x-1) % 6 ==0) | ((x+1) %6 ==0) {
primes.push(x);
}
}
}
let max_value = primes.iter().max()?;

}
``````

The `largest_prime_factor` function's role is to find the largest prime factor of the number in it's input.

I push all prime factors to the `primes` vector, and then return the largest, but I'm unsure how to return the largest integer. If the .max() function returns an error - the documents say it would return None, but when I place None as a possibility to return, it says it isn't a data type, and to use my variant's enum, but look at the docs, the None does seem to be the enum. So what does the function actually return? Am I using `?` incorrectly

Solution

• If you look at the signature for the `max` method, you can see that it returns an Option:

``````fn max(self) -> Option<Self::Item>
``````

In this case, it returns `Option<i64>`.

The Option type is an enum which has two variants, to simplify:

``````enum Option<T> {
Some(T),
None,
}
``````

Here, `None` isn't a type, but an enum variant.

Here is what your method should look like:

``````fn largest_prime_factor(num:i64) -> Option<i64> {
let mut primes: Vec<i64> = Vec::new();

for x in 1i64..=num {
if num % x == 0 {
if (x == 2) | (x==3) | ((x-1) % 6 ==0) | ((x+1) %6 ==0) {
primes.push(x);
}
}
}

primes.iter().max().cloned()
}
``````

You don't even need a Result type here, as it doesn't really make sense to return an error.

Returning an Option signals that there can be zero or one result.