Добрый день!
Я давно заметил, что онлайн-компилятор как-то странно обновляется. Судя по всему, там довольно старая версия.
Синтаксис unboxed-замыканий, который вы используете, устарел. Теперь нужно так:
#![feature(unboxed_closures)]
fn make_adder(n: int) -> Box<Fn(int) -> int + 'static> {
box move |i| i+n
}
fn ad(f: &Box<Fn(int) -> int + 'static>, i: int) -> int {
f.call((i,))
}
fn main() {
let f = make_adder(4);
println!("{}", ad(&f, 13));
println!("{}", f.call((15,)));
}
Однако это работать не будет до тех пор, пока не вмёржат пулл-реквест [1] (засабмичен 2 часа назад :)), меняющий приоритет оператора `+` в грамматике типов. До этого придётся писать так:
#![feature(unboxed_closures)]
fn make_adder(n: int) -> Box<Fn<(int,), int> + 'static> {
box move |i| i+n
}
fn ad(f: &Box<Fn<(int,), int> + 'static>, i: int) -> int {
f.call((i,))
}
fn main() {
let f = make_adder(4);
println!("{}", ad(&f, 13));
println!("{}", f.call((15,)));
}
Кстати, буквально пару дней назад синтаксис создания unboxed-замыканий унифицировали со старыми замыканиями, так что теперь необязательно писать `|&: i: int|`, достаточно просто `|i|` (но `move` всё-таки нужно). В скором времени, я думаю, сделают и так, чтобы можно было вызывать замыкания через Deref, т.е. можно будет выкинуть ещё и явный вызов `call()`, такое ишью тоже висит.
[1]:
https://github.com/rust-lang/rust/pull/19298
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/rust-russian/c478a7da-9d18-451e-8c6c-34298738d96f%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
https://groups.google.com/d/optout.