Как заставить структуру владеть chrono::format::Item?

У меня есть структура, содержащая строку, которая используется для форматирования дат с помощью chrono::DateTime.format():

struct DateThingy {
    format: String,
}

impl DateThingy {
    fn new(format: String) -> Self {
        Self { format }
    }
}

Это немного бесполезно, поскольку строку формата необходимо анализировать каждый раз, когда я форматирую дату. Чтобы быть более эффективным, я решил, что нужно один раз проанализировать строку формата и вместо этого сохранить результат. Затем я могу отформатировать, используяchrono::DateTime::format_with_items:

use chrono::format::strftime::StrftimeItems;
use chrono::format::Item;

struct DateThingy<'a> {
    items: Vec<Item<'a>>,
}

impl<'a> DateThingy<'a> {
    fn new(format: String) -> Self {
        Self {
            items: StrftimeItems::new(&format).collect(),
        }
    }
}

Это не работает:

error[E0515]: cannot return value referencing function parameter `format`
  --> src/lib.rs:10:9
   |
10 | /         Self {
11 | |             items: StrftimeItems::new(&format).collect(),
   | |                                       ------- `format` is borrowed here
12 | |         }
   | |_________^ returns a value referencing data owned by the current function

Я могу изменить подпись new к fn new(format: &'a str) -> Self чтобы избавиться от ошибки, но теперь создатель DateThingyдолжен убедиться, что строка формата жива достаточно долго, и возиться со сроками жизни. Я просто хочуDateThingy владеть всей необходимой информацией, не полагаясь на ссылки или время жизни.

Как мне этого добиться?

Создание DateThingy не критичен к производительности, поэтому я с радостью клонирую строки, выделяю, сохраняю их и т. д., если это помогает.

0 ответов

Другие вопросы по тегам