小编avy*_*avy的帖子

如何从结果迭代器返回包含每个错误的结果,而不仅仅是第一个错误?

我正在尝试在 Rust 中实现一个简单的解释器,为此我创建了一个Tokens结构,它采用源字符并在 a 中生成 aTokenScanErrora Result

pub struct Tokens<'src> {
    chars: Chars<'src>,
}

impl<'src> Iterator for Tokens<'src> {
    type Item = Result<Token, ScanError>;

    fn next(&mut self) -> Option<Result<Token, ScanError>> {
        //  ...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于Resultimplements FromIterator,将结果收集到s的第一个ScanError或向量很简单Token

fn scan_tokens(source: &str) -> Result<Vec<Token>, ScanError> {
    let iter = Tokens {
        chars: source.chars(),
    };

    iter.collect()
}
Run Code Online (Sandbox Code Playgroud)

在出现多个错误的情况下,我真的想返回每个错误:

fn scan_tokens(source: &str) -> Result<Vec<Token>, Vec<ScanError>> {
    // what …
Run Code Online (Sandbox Code Playgroud)

error-handling iterator rust

4
推荐指数
2
解决办法
780
查看次数

使用复合文字初始化指向结构的指针

我是 C 的新手,我正在尝试理解复合文字的语法。我的问题类似于在 C 中初始化指向复合文字的指针,但我认为这不能回答它。如果有一个结构体和一个类型定义为指向结构体的指针,如下所示:

typedef struct thing *thing_t;
struct thing
{
    int id;
    char *name;
};
Run Code Online (Sandbox Code Playgroud)

然后我可以创建一个thing_t这样的:

thing_t instance = & (struct thing) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以在thing_t不显式引用的情况下初始化 a struct thing,例如我试过这个以查看它是否是有效的语法:

thing_t instance = (* thing_t) {
    .id = 1,
    .name = "A"
};
Run Code Online (Sandbox Code Playgroud)

但编译器错误。编译器必须“知道”该thing_t类型包含一个指向 a 的指针thing,但是是否有语法允许在此上下文中可互换地使用这两者?

(我没有一个特定的用例,我只是想了解类型和结构是如何相关的)。

c pointers compound-literals

2
推荐指数
1
解决办法
1386
查看次数

当我链接迭代器而不是收集到临时HashSet时,为什么会得到不一致的结果?

我正在写一个Rust函数,它接受一个数字列表和一个最大值,并将给定数字的所有倍数加到最大值(重复数只计算一次).我写的函数的第一个版本是

use std::collections::HashSet;

pub fn sum_of_multiples(limit: u32, factors: &[u32]) -> u32 {
    let set: HashSet<u32> = factors
        .iter()
        .map(|factor| {
            let top: u32 = (limit - 1) / factor;

            (1..=top).map(move |num| num * factor)
        }).flatten()
        .collect();

    set.iter().fold(0, |acc, num| acc + num)
}
Run Code Online (Sandbox Code Playgroud)

(我知道合并HashSets这样可能不是最好的解决方案).这给出了预期的结果:

println!("{}", sum_of_multiples(100, &[3, 5])) // 2318
Run Code Online (Sandbox Code Playgroud)

当我把呼叫collect从中间取出并连接到最后一个时fold,我得到了一个不同的答案:

pub fn sum_of_multiples(limit: u32, factors: &[u32]) -> u32 {
    let val: u32 = factors
        .iter()
        .map(|factor| {
            let top: u32 = (limit - …
Run Code Online (Sandbox Code Playgroud)

iterator hashset rust data-structures

0
推荐指数
1
解决办法
78
查看次数