Как заставить структуру владеть 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
не критичен к производительности, поэтому я с радостью клонирую строки, выделяю, сохраняю их и т. д., если это помогает.