【发布时间】:2020-04-18 11:51:06
【问题描述】:
为了学习 Rust,我正在编写一个解析器组合库。现在我遇到了一个跨越复杂切片类型和所有权的问题。我有一些构建块函数希望能够单独使用:
pub fn achar(character: char) -> impl Fn(&str) -> Option<char> {
move |input| match input.chars().next() {
Some(c) if c == character => Some(c),
_ => None,
}
}
pub fn alternatives<'a, T>(
alts: &'a [impl Fn(&'a str) -> Option<T>],
) -> impl Fn(&'a str) -> Option<T> {
move |input| {
for alt in alts.iter() {
let tried = alt(input);
if tried.is_none() {
continue;
}
return tried;
}
None
}
}
pub fn one_of<'a>(allowed: &'a str) -> impl Fn(&'a str) -> Option<char> {
let v = allowed.chars().map(achar).collect::<Vec<_>>();
alternatives(&v)
}
然后使用将如下所示:
fn main() {
println!("{:?}", achar('f')("foo"));
println!("{:?}", alternatives(vec![achar('f'), achar('b')])("foo"));
println!("{:?}", one_of("foo")("foo"));
}
就像我收到以下错误:
= note: expected type `for<'r> fn(&'r str) -> std::option::Option<char> {any_char}`
found reference `&impl for<'r> std::ops::Fn<(&'r str,)>`
我会说quote 实现了Fn(&str),不是吗?我怎样才能让它工作?
一旦解决了下一个问题:
33 |替代品(&v) | ^^^^^^^^^^^^^^--^ | | | | | `v` 在这里借用 |返回引用当前函数拥有的数据的值当然,内联并不能解决问题。我不知道如何攻击它。
【问题讨论】:
-
您帖子中的代码不会导致与 Playground 中的代码相同的错误。
-
谢谢trentcl。在写这篇文章时,我仍在努力让它发挥作用。我一定是混淆了版本。
标签: types rust closures lifetime ownership