Understanding Rust Error E0308

Introduction to Rust Error E0308

Rust Error E0308 occurs when the expected type of an expression does not match the received type. This commonly happens when calling a function and passing an argument of a different type than the one specified in the function's signature or when initializing a variable with an incompatible value.

Erroneous Code Example

Consider the following code:

fn main() {
fn plus_one(x: i32) -> i32 {
    x + 1

plus_one("Not a number");
//       ^^^^^^^^^^^^^^ expected `i32`, found `&str`

if "Not a bool" {
// ^^^^^^^^^^^^ expected `bool`, found `&str`

let x: f32 = "Not a float";
//     ---   ^^^^^^^^^^^^^ expected `f32`, found `&str`
//     |
//     expected due to this

Code Explanation

In this code example, the plus_one function expects an argument of type i32, but it receives a string literal "Not a number" instead, which causes an 'expected i32, found &str' error. The second error occurs when a string literal "Not a bool" is used in an if condition, but a bool value is expected. Finally, a variable x of type f32 is initialized with a string literal "Not a float", thus leading to an 'expected f32, found &str' error.


To fix Rust Error E0308, ensure that the expected and received types match. You can correct the code example as follows:

fn plus_one(x: i32) -> i32 {
    x + 1

let num = 5;

let condition = true;
if condition {
    // ...

let x: f32 = 3.14;

Further Considerations

It is essential to understand Rust's type system and how to work with different data types. Learn about type casting, type inference, and common conversion functions to avoid Rust Error E0308. Keeping functions simple and explicit by using the right input types and providing helpful comments can also prevent this error.