gpt4 book ai didi

rust - 如何创建将输入转换为元组的宏?

转载 作者:行者123 更新时间:2023-12-03 11:45:16 25 4
gpt4 key购买 nike

如果可能,我想避免创建许多带编号的函数和重复的代码。我正在编写一个程序来解析包含以下内容的行的配置文件,并且我想使用一些辅助函数来简化解析该文件的逻辑。
我想就Rust的惯用方式提出建议,以避免在保持可读性的同时避免代码重复。我最好的猜测是,如果我可以使用一个宏,该宏可以以某种方式将输入转换为一个块,从而生成一个元组,但是却不知道如何在包含迭代和转换步骤的情况下编写该宏。
示例输入

attribute-name
1 2
other-attribute
3 4 5
当前解析实现
/// Splits `s` into two values, using `pattern` to find the split. If not enough values
/// are present, `missing_err` is returned.
/// It then `transform`s each entry, returning the result as a tuple
fn split_str_into_2<'a, T, E>(
s: &'a str,
pattern: &str,
transform: &dyn Fn(&str) -> T,
missing_err: &E,
) -> Result<(T, T), E> where E: Copy {
let mut split = s.splitn(2, pattern);
Ok((
transform(split.next().ok_or_else(|| *missing_err)?),
transform(split.next().ok_or_else(|| *missing_err)?),
))
}

/// Same as above but parses into a tuple of 3
fn split_str_into_3<'a, T, E>( ...
调用代码
let (width, height) = split_str_into_2(
input_line, " ", |entry| i32::from_str_radix(entry, 10), &MyError::new("Missing number entry"))?;

最佳答案

我不知道您的确切用法,但是如果您想将迭代器收集到元组中,则一种可能是 Itertools::collect_tuple
目前,这是针对tuples up to length 4实现的。如果需要更多元素,则可以尝试改编itertools中采用的方法或对项目提出问题/PR。

关于rust - 如何创建将输入转换为元组的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62497834/

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