gpt4 book ai didi

rust - 如何将 `chrono::format::strftime` 静态转换为 `chrono::format::Item`?

转载 作者:行者123 更新时间:2023-11-29 08:08:36 28 4
gpt4 key购买 nike

我有一个 chrono::format::strftime 的静态数组我的应用程序支持的格式。我想避免在运行时解析它们,所以我定义了一个 lazy_static!将它们解析为 chrono::format::Item 集合的 block .

但是,当我尝试遍历已解析的集合时,出现错误:

the trait bound `&chrono::format::StrftimeItems<'_>: std::iter::Iterator` is not satisfied

这是一个简短的复制:

#[macro_use]
extern crate lazy_static;
extern crate chrono;
use chrono::DateTime;
use chrono::offset::FixedOffset;
use chrono::format::{Parsed, parse};
use chrono::format::strftime::StrftimeItems;

static FORMATS : &[&'static str] = &["%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S%.f"];

lazy_static! {
static ref PARSED_FORMATS : Vec<StrftimeItems<'static>> = FORMATS
.iter()
.map(|format| StrftimeItems::new(format))
.collect();
}

fn parse_datetime(s: &str) -> Option<DateTime<FixedOffset>> {
for format in PARSED_FORMATS.iter() {
let mut parsed = Parsed::new();
let dt = parse(&mut parsed, &s, format)
.and_then(|_| parsed.to_datetime() );
if dt.is_ok() {
return dt.ok()
}
}
return None
}

正在尝试取消引用 format在循环中给出了这个错误:

error[E0507]: cannot move out of borrowed content
--> src\main.rs:21:35
|
21 | let dt = parse(&mut parsed, &s, *format)
| ^^^^^^^ cannot move out of borrowed content

error: aborting due to previous error

正在尝试克隆 format似乎可行,但克隆在这里似乎是多余的,我想避免它。

这是正确的方法吗?或者使用宏可能是更好的选择?

最佳答案

StrftimeItems是迭代器,而不是可迭代容器(如 Vec 是)。当你推进一个迭代器时,你不能倒带它。 parse必须按值接收迭代器,这意味着您必须采用 StrftimeItems我们的向量(这意味着您以后不能重复使用它)或克隆 StrftimeItems存储在向量中。通过克隆 StrftimeItems ,您可以生成一个新的迭代器,其状态与原始迭代器不同(即推进一个不会推进另一个)。

I'd like to avoid parsing them during run time

然而,StrftimeItems不会让你实现你的目标,因为 StrftimeItems lazily parses the format string as the iterator advances .

相反,我建议您将该迭代器的结果收集到 Vec<Item<'static>> 中。 .

#[macro_use]
extern crate lazy_static;
extern crate chrono;
use chrono::DateTime;
use chrono::offset::FixedOffset;
use chrono::format::{Item, Parsed, parse};
use chrono::format::strftime::StrftimeItems;

static FORMATS : &[&'static str] = &["%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S%.f"];

lazy_static! {
static ref PARSED_FORMATS : Vec<Vec<Item<'static>>> = FORMATS
.iter()
.map(|format| StrftimeItems::new(format).collect())
.collect();
}

fn parse_datetime(s: &str) -> Option<DateTime<FixedOffset>> {
for format in PARSED_FORMATS.iter() {
let mut parsed = Parsed::new();
let dt = parse(&mut parsed, &s, format.iter().cloned())
.and_then(|_| parsed.to_datetime() );
if dt.is_ok() {
return dt.ok()
}
}
return None
}

现在,当我们调用 parse , 我们通过 format.iter().cloned() . formatVec<Item<'static>> , iter()在对 Item 的引用上生成一个新的迭代器s 和 cloned()调整迭代器,使每个 Item按值返回(通过克隆它们实现)而不是按引用返回(因为 parse 期望迭代器超过 Item 值,而不是 Item 引用)。

关于rust - 如何将 `chrono::format::strftime` 静态转换为 `chrono::format::Item`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com