ошибка [E0308]: несоответствующие типы - ожидается `& str`, найдена структура` std :: string :: String` - PullRequest
0 голосов
/ 11 марта 2020

Я играю в ti c -ta c. Код не полный, но я застрял здесь. Я хочу вывести array_display на консоль, но когда я назначаю строку, появляется сообщение об ошибке.

use std::io;

fn main() {
    let mut player1: String = String::new();
    let mut player2: String = String::new();
    let mut positions = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];

    let mut lets_play = true;

    println!("Welcome to tic tac toe");
    println!("Player 1 please select what symbol you want to be : (x or o)");
    io::stdin().read_line(&mut player1);

    player1 = player1.to_lowercase();
    println!("{:?}", player1);

    if player1.trim() == "x" {
        player1 = String::from("x");
        player2 = String::from("o");
        println!("Player 1 is x");
    } else if player1.trim() == "o" {
        player1 = String::from("o");
        player2 = String::from("x");
        println!("Player 1 is o");
    } else {
        println!("Input is not valid");
        lets_play = false;
    }
    if lets_play {
        println!("Let's start the game :");

        print_board(&mut positions);
    } else {
        println!("Please reset the game");
    }
}

fn print_board(arr: &mut [&str]) {
    let mut counter = 0;
    let mut array_display = ["1", "2", "3"];
    let mut array_position = 0;
    let mut string_for_array = String::new();

    for i in 0..arr.len() {
        string_for_array.push_str(arr[i]);
        counter += 1;
        if counter == 3 {
            println!(
                "array_display[{}] value =  {}",
                array_position, string_for_array
            );
            array_display[array_position] = string_for_array.to_string();
            println!("String to push {:?}", string_for_array);
            string_for_array = String::from("");
            println!("Array position {}", array_position);
            array_position += 1;
            counter = 0;
        }
    }
}

Ошибка:

error[E0308]: mismatched types
  --> src/main.rs:52:45
   |
52 |             array_display[array_position] = string_for_array.to_string();
   |                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |                                             |
   |                                             expected `&str`, found struct `std::string::String`
   |                                             help: consider borrowing here: `&string_for_array.to_string()`

1 Ответ

2 голосов
/ 11 марта 2020

Текущая проблема в вашем коде состоит в том, что string_for_array.to_string() создает новый String, но массив array_display содержит &str ссылок.

Предложение, которое здесь дает компилятор (заменяя на &string_for_array.to_string()) не работает, потому что результат .to_string() будет освобожден в конце строки, и у вас будет недопустимая ссылка &str.

Итак, проблема в том, что некоторые переменные должны принадлежать эта строка. Поскольку string_for_array изменяется позже, его нельзя использовать. Естественный выбор - array_display (потому что именно там эта строка будет жить в любом случае). Итак, сначала измените этот массив, чтобы он содержал String s вместо &str ссылок:

    let mut array_display = ["1".to_owned(), "2".to_owned(), "3".to_owned()];

А затем скомпилируется остальная часть кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...