簡體   English   中英

無法索引到“char”類型的值

[英]cannot index into a value of type `char`

我正在用 Rust 編寫一個簡單的愛好編程語言,但我陷入了這個錯誤(我正在嘗試翻譯 c 代碼,我對這個語言有點陌生):

error[E0608]: cannot index into a value of type `char`
  --> src/lexer.rs:28:19
   |
28 |         lexer.c = lexer.src[lexer.i];
   |                   ^^^^^^^^^^^^^^^^^^

這是代碼:

pub struct LexerStruct {
    src: char,
    src_size: usize,
    c: char,
    i: u32,
}

pub fn init_lexer(src: char) -> LexerStruct {
    let lexer: LexerStruct = LexerStruct {
        src,
        src_size: src.len_utf16() as usize,
        i: 0,
        c: '\0',
    };

    lexer
}

fn lexer_advance(lexer: LexerStruct) {
    if ((lexer.i as usize) < lexer.src_size && lexer.c != '\0') {
        lexer.i += 1;
        lexer.c = lexer.src[lexer.i];
    }
}

C 中的char* data, size_t size的組合存在於 Rust 中的類型中:切片類型 就是這樣,一個指向數組的指針和一個長度。

請注意,Rust 中的char實際上是一個帶有u32字符的 u32。 char*的確切翻譯是&[u8]

因此,將您的 C 結構直接轉錄為 Rust 將是:

pub struct LexerStruct<'a> {
    src: &'a [u8],
    c: char,
    i: u32,
}

如果src無論如何都是人類可讀的文本,那么使用字符串切片會更容易,因為它是等效的(它在內部也是一個&[u8] ,但帶有一堆很好的字符串操作功能):

pub struct LexerStruct<'a> {
    src: &'a str,
    c: char,
    i: u32,
}

這兩個都帶有生命周期<'a>因為它們不擁有src中的數據,它們只是指向它。 如果您的原始源代碼在 Lexer 的整個生命周期中都存在,那么這實際上就是您想要的,因為它使 Lexer 零拷貝。

但是,如果您堅持您的 Lexer 應該擁有數據,那么您需要復制它並將其存儲在Vec<u8>String中,具體取決於您的偏好。 就像在 slice 類型中一樣,它們是等價的, String具有許多用於字符串操作的額外功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM