заимствование возможно неинициализированной переменной для оператора сопоставления - PullRequest
0 голосов
/ 02 апреля 2020

Я проектировал библиотеку, которая транслитерирует данную строку на украинский язык sh на английский язык, поэтому я решил использовать оператор 'match' для определения оператора с проверкой нескольких условий. Но я столкнулся с ошибкой компилятора, которая типична для Rust, но совершенно невозможна в моей ситуации (по крайней мере, я так полагаю).


   --> src/lib.rs:188:21
    |
188 |  origin_mutated[i] = 'Y';
    |  ^^^^^^^^^^^^^^ use of possibly-uninitialized `origin_mutated`

error: aborting due to previous error

Вот полный код библиотеки. Пожалуйста, ударьте меня носом по проблеме, если я не вижу что-то очевидное (потому что у меня есть подозрение, что это может быть ошибка в компиляторе)

pub fn transliterate(mut origin: String) -> String {
    let counter: usize = origin.chars().count();
    let mut j: usize = 0;
    let mut i: usize = 0;
    let origin_vec: Vec<char> = origin.chars().collect();
    let mut origin_mutated: Vec<char>;
    if j <= counter{
        while j <= counter {
            match origin_vec[j] {
                'А' => {
                    origin_mutated[i] = 'A';
                    i+=1;
                    j+=1;
                    },
                'Б' => {
                    origin_mutated[i] = 'B';
                    j+=1;
                    i+=1;
                    },
                'В' => {
                    origin_mutated[i] = 'V';
                    i+=1;
                    j+=1;
                    },
                'Г' => {
                    origin_mutated[i] = 'H';
                    i+=1;
                    j+=1;
                    },
                'Ґ' => {
                    origin_mutated[i] = 'G';
                    i+=1;
                    j+=1;
                    },
                'Д' => {
                    origin_mutated[i] = 'D';
                    i+=1;
                    j+=1;
                    },
                'Е' => {
                    origin_mutated[i] = 'E';
                    i+=1;
                    j+=1;
                    },
                'Є' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'e';
                    i+=1;
                    },
                'Ж' => {
                    origin_mutated[i] = 'Z';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    },
                'З' => {
                    origin_mutated[i] = 'Z';
                    i+=1;
                    j+=1;
                    },
                'И' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    },
                'І' => {
                    origin_mutated[i] = 'I';
                    i+=1;
                    j+=1;
                    },
                'Ї' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'i';
                    i+=1;
                    },
                'Й' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    },
                'К' => {
                    origin_mutated[i] = 'K';
                    i+=1;
                    j+=1;
                    },
                'Л' => {
                    origin_mutated[i] = 'L';
                    i+=1;
                    j+=1;
                    },
                'М' => {
                    origin_mutated[i] = 'M';
                    i+=1;
                    j+=1;
                    },
                'Н' => {
                    origin_mutated[i] = 'N';
                    i+=1;
                    j+=1;
                    },
                'О' => {
                    origin_mutated[i] = 'O';
                    i==1;
                    j+=1;
                    },
                'П' => {
                    origin_mutated[i] = 'P';
                    i+=1;
                    j+=1;
                    },
                'Р' => {
                    origin_mutated[i] = 'R';
                    i==1;
                    j+=1;
                    },
                'С' => {
                    origin_mutated[i] = 'S';
                    i==1;
                    j+=1;
                    },
                'Т' => {
                    origin_mutated[i] = 'T';
                    i==1;
                    j+=1;
                    },
                'У' => {
                    origin_mutated[i] = 'U';
                    i+=1;
                    j+=1;
                    },
                'Ф' => {
                    origin_mutated[i] = 'F';
                    i==1;
                    j+=1;
                    },
                'Х' => {
                    origin_mutated[i] = 'K';
                    i+=1;
                    j==1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    },
                'Ц' => {
                    origin_mutated[i] = 'T';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 's';
                    i+=1;
                    },
                'Ч' => {
                    origin_mutated[i] = 'C';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    },
                'Ш' => {
                    origin_mutated[i] = 'S';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    },
                'Щ' => {
                    origin_mutated[i] = 'S';
                    i+=1;
                    j==1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    origin_mutated[i] = 'c';
                    i+=1;
                    origin_mutated[i] = 'h';
                    i+=1;
                    },
                'Ю' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'u';
                    i+=1;
                    },
                'Я' => {
                    origin_mutated[i] = 'Y';
                    i+=1;
                    j+=1;
                    origin_mutated[i] = 'a';
                    i+=1;
                    },
                _ => {
                    j+=1;
                    }
                }
            }
        }
    else if j > counter{
        origin_mutated[i] = '\n'; 
    }
    else {
        origin = origin_mutated.into_iter().collect();
    }
    //origin = origin_mutated.into_iter().collect();
    (origin)
}

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Я не уверен, почему ваша программа не компилируется, но даже если бы она скомпилировалась, я думаю, что она, вероятно, вызовет пани c, когда вы попытаетесь проиндексировать ваш origin_mutated вектор. Причина в том, что ваш origin_mutated ve c имеет длину 0, поэтому попытка индексировать его будет панировать c в соответствии с документами .

Вы не можете индекс в элемент вашего вектора, который еще не существует. Вам нужно использовать метод типа push() или аналогичный, чтобы увеличить Vec.

Но есть еще лучший способ сделать это с Rust: перебирая входные данные String и map пинг над его элементами:

pub fn transliterate(origin: &str) -> String {
    origin.chars().map(transliterate_letter).collect()
}

fn transliterate_letter(letter: char) -> &'static str {
    match letter {
        'А' => "A",
        'Б' => "B",
        ...
        'Є' => "Ye",
        ...
    }
}

Детская площадка

2 голосов
/ 03 апреля 2020

Причина ошибки в том, что эта строка НЕ ​​создает Ve c:

let mut origin_mutated: Vec<char>;

. Она создает переменную, которая может содержать Ve c, но пока нет, даже нулевой длины. Это все равно что сказать

let a: i32;

Это не имеет значения. Вы, вероятно, имели в виду

let mut origin_mutated: Vec<char> = Vec::new();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...