Добрый вечер!
У вас ошибка в сигнатуре функции `pfilter()`:
> fn pfilter<S>(p:Parser<S,char>, f:Box<Fn<(char,), bool>>) -> Parser<S,char> {
Здесь не указан lifetime-параметр у `f`, который должен обязательно быть `’static`, потому что `f` перемещается в окружение замыкания `Parser`:
fn pfilter<S>(p:Parser<S,char>, f:Box<Fn<(char,), bool> + ’static>) -> Parser<S,char> {
После этого программа скомпилируется. Я подозреваю, что компилятор вам этого не говорит из-за lifetime elision, но это весьма подозрительно.
Вообще же здесь передача `f` внутри `Box` не обязательна. Поскольку замыкание передаётся внутрь функции и там же и остаётся, то лучше использовать дженерики. В целом, вот слегка обновлённый вариант:
#![feature(unboxed_closures)]
type ParseResult<S /*:Seq<C>*/,T> = Vec<(T, S)>;
type Parser<S /*:Seq<C>*/,T> = Box<Fn<(S,), ParseResult<S, T>> + 'static>;
fn pfilter<S, F>(p: Parser<S, char>, f: F) -> Parser<S, char>
where F: Fn(char) -> bool, F: 'static {
println!("{}", f('a'));
box move |s: S| {
p.call((s,)).into_iter().filter(|v| match *v { (ref r, _) => f(*r) }).collect()
}
}
fn main() {
println!("{}", pfilter(box move |s: &str| vec![('1', s.clone())], move |c| c == '1').call(("123",)));
}
Компилируется и работает, насколько я могу судить.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/rust-russian/eaadf7ac-980f-41df-a50d-9f8a6ea00528%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
https://groups.google.com/d/optout.