[英]Why do I need to provide a lifetime parameter for my iterator item?
我正在嘗試制作一個簡單的日志解析器作為我在 Rust 中的第一個項目。
我已經創建了一個結構來包含每個解析的日志行,我現在正在制作一個“解析器”結構,它應該擁有 BufReader 並實現Iterator
以讓用戶遍歷每個解析的行。
一旦我開始實施Iterator
,我就遇到了障礙。
實現Iterator
的一部分是設置關聯類型,我不允許將關聯類型設置為LogLine
:
error[E0106]: missing lifetime specifier
--> src/parser.rs:27:17
|
27 | type Item = LogLine;
| ^^^^^^^ expected named lifetime parameter
|
help: consider introducing a named lifetime parameter
|
27 | type Item<'a> = LogLine<'a>;
| ++++ ~~~~~~~~~~~
For more information about this error, try `rustc --explain E0106`.
為什么我必須為LogLine
指定生命周期參數? 據我了解,我在LogLine
的定義中所說的只是每個字符串切片字段必須與結構本身一樣長。
為什么在這種情況下有必要提供一個命名的生命周期參數,我應該將它設置為什么?
這是我的代碼:
use std::fs::File;
use std::io;
use std::io::BufReader;
pub struct LogParser {
pub bufreader: BufReader<File>,
}
pub struct LogLine<'a> {
line: String,
severity: &'a str,
message: &'a str,
}
impl LogParser {
pub fn new(path: &str) -> io::Result<Self> {
let file = File::open(path)?;
let bufreader = BufReader::new(file);
return Ok(LogParser {
bufreader: bufreader,
});
}
}
impl Iterator for LogParser {
type Item = LogLine;
fn next(&mut self) -> Option<Self::Item> {
// ...
}
}
與問題無關,這是我的計划:
LogLine
結構line
字段,該字段擁有完整的原始日志行line
字段的字符串切片,因此所有字段都應該具有相同的生命周期我希望這是健全的。
據我了解,我在
LogLine
的定義中所說的只是每個字符串切片字段必須與結構本身一樣長。
這是錯誤的:在結構上具有生命周期參數的含義是結構在此生命周期參數上是通用的,並且您必須提供一些生命周期才能創建實際類型。 這個生命周期將作為&str
字段的生命周期。 確實,此生命周期必須小於實例的生命周期,但這是因為另一件事(格式良好)。
您正在嘗試做的是有問題的:您正在嘗試創建一個自引用 struct ,即包含對其自身字段的引用的結構。 你不能輕易做到這一點。 請參閱為什么我不能在同一個結構中存儲一個值和對該值的引用? 用於問題解釋和解決方案,但 TL;DR 是“不要那樣做”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.