[英]Rust cannot index into a value of type 'datatype<{integer}, {integer}>`
[英]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.