我正在尝试在 Rust 中实现一个简单的解释器,为此我创建了一个Tokens结构,它采用源字符并在 a 中生成 aToken或ScanErrora 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) 我是 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,但是是否有语法允许在此上下文中可互换地使用这两者?
(我没有一个特定的用例,我只是想了解类型和结构是如何相关的)。
我正在写一个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)