Почему байт, который был приведен к символу, не имеет правильного типа при нажатии на строку? - PullRequest
0 голосов
/ 31 марта 2019

Используя этот ответ Я пытаюсь написать функцию Rust, которая преобразует 128-битное целое число в число с основанием 62.

fn encode_as_chars(mut integer: u128) {
    let alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".as_bytes();
    let base: u128 = 62;
    let mut encoded: String;

    while integer != 0 {
        encoded = encoded.push(alphabet[(integer % base) as usize] as char);
        integer /= base;
    }
    encoded;
}

Я получаю доступ к символу в алфавите с помощьюиндексировать с помощью as_bytes() и привести байт обратно к символу, намереваясь выдвинуть символ в кодированную строку с помощью String::push.Однако компилятор жалуется на это, возвращая ошибку

error[E0308]: mismatched types
 --> src/lib.rs:7:19
  |
7 |         encoded = encoded.push(alphabet[(integer % base) as usize] as char);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found ()
  |
  = note: expected type `std::string::String`
             found type `()`

Я попытался явно выделить память для символа с помощью to_owned():

let character: char = (alphabet[(integer % base) as usize] as char).to_owned();
encoded = encoded.push( character );

, но это вернуло ту же ошибку.

Почему байт, который был приведен к символу, не имеет правильного типа при нажатии на строку?

1 Ответ

1 голос
/ 31 марта 2019

Это потому, что push для типа String ничего не возвращает и ergo возвращает ()

Измените свой код на:

// `->` specifies return type
fn encode_as_chars( mut integer: u128 ) -> String {
    let alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".as_bytes();
    let base: u128 = 62;
    let mut encoded: String = "".to_string(); // you need to initialize every variable in Rust

    while integer != 0 {
        encoded.push( alphabet[(integer % base) as usize] as char );
        integer /= base;
    }

    encoded // return encoded
}
...