Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The trait bound is not satisfied in Rust

Tags:

rust

I'm trying to write a Tic Tac Toe game in Rust, but this function for changing a field doesn't work and I don't know what's wrong with it:

fn change_field(mut table: [char; 9], field: i32, player: char) -> bool {
    if field > 0 && field < 10 {
        if table[field - 1] == ' ' {
            table[field - 1] = player;
            return true;
        } else {
            println!("That field isn't empty!");
        }
    } else {
        println!("That field doesn't exist!");
    }

    return false;
}

I'm getting these errors:

src/main.rs:16:12: 16:26 error: the trait bound `[char]: std::ops::Index<i32>` is not satisfied [E0277]
src/main.rs:16         if table[field-1] == ' ' {
                          ^~~~~~~~~~~~~~
src/main.rs:16:12: 16:26 help: run `rustc --explain E0277` to see a detailed explanation
src/main.rs:16:12: 16:26 note: slice indices are of type `usize`
src/main.rs:17:13: 17:27 error: the trait bound `[char]: std::ops::Index<i32>` is not satisfied [E0277]
src/main.rs:17             table[field-1] = player;
                           ^~~~~~~~~~~~~~
src/main.rs:17:13: 17:27 help: run `rustc --explain E0277` to see a detailed explanation
src/main.rs:17:13: 17:27 note: slice indices are of type `usize`
src/main.rs:17:13: 17:27 error: the trait bound `[char]: std::ops::IndexMut<i32>` is not satisfied [E0277]
src/main.rs:17             table[field-1] = player;
                           ^~~~~~~~~~~~~~

In later versions of Rust, I get these errors:

error[E0277]: the trait bound `i32: std::slice::SliceIndex<[char]>` is not satisfied
 --> src/main.rs:3:12
  |
3 |         if table[field - 1] == ' ' {
  |            ^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
  |
  = help: the trait `std::slice::SliceIndex<[char]>` is not implemented for `i32`
  = note: required because of the requirements on the impl of `std::ops::Index<i32>` for `[char]`

error[E0277]: the trait bound `i32: std::slice::SliceIndex<[char]>` is not satisfied
 --> src/main.rs:4:13
  |
4 |             table[field - 1] = player;
  |             ^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
  |
  = help: the trait `std::slice::SliceIndex<[char]>` is not implemented for `i32`
  = note: required because of the requirements on the impl of `std::ops::Index<i32>` for `[char]`

This is my first project in Rust so I don't have much experience with it. I tried to change the field to u32 too.

like image 309
Nikola Stojaković Avatar asked Aug 29 '16 15:08

Nikola Stojaković


People also ask

What is the point of traits in Rust?

A trait tells the Rust compiler about functionality a particular type has and can share with other types. Traits are an abstract definition of shared behavior amongst different types. So, we can say that traits are to Rust what interfaces are to Java or abstract classes are to C++.

How do you implement a trait in Rust?

Implementing a trait in Rust To implement a trait, declare an impl block for the type you want to implement the trait for. The syntax is impl <trait> for <type> . You'll need to implement all the methods that don't have default implementations.


1 Answers

The reason is given to you in the notes:

note: slice indices are of type `usize`
slice indices are of type `usize` or ranges of `usize`

You need to cast the i32 value to usize, for example:

table[(field - 1) as usize]

Alternatively, consider using usize as the type of the field variable, if it makes sense in your application.

like image 72
michalsrb Avatar answered Oct 07 '22 06:10

michalsrb