簡體   English   中英

為什么我需要為我的迭代器項提供生命周期參數?

[英]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.

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