Трейт FnOnce
Трейт FnOnce описывает вызываемые объекты,
которые можно вызвать ровно один раз. Он является
одним из трёх трейтов для вызовов наряду с
Fn и FnMut. Параметром метод
call_once принимает значение типа
Self::Output и возвращает результат вызова.
Особенность FnOnce в том, что при вызове
замыкание может поглотить захваченные переменные,
переместив их внутрь себя, поэтому повторный вызов
становится невозможен. Любое замыкание, которое
реализует Fn или FnMut,
автоматически реализует и FnOnce, но не
наоборот.
Синтаксис
trait FnOnce<Args>
{
type Output;
fn call_once(self, args: Args) -> Self::Output;
}
Пример
Давайте создадим замыкание, которое поглощает
переменную "abcde" и вызывается один раз:
fn main()
{
let s = String::from("abcde");
let consume = move || s;
let res = consume();
println!("{}", res);
}
Результат выполнения кода:
abcde
Пример
Давайте напишем функцию, которая принимает
замыкание с ограничением FnOnce и вызывает
его ровно один раз:
fn call_once_fn<F>(f: F)
where
F: FnOnce() -> i32,
{
let res = f();
println!("{}", res);
}
fn main()
{
let s = String::from("12345");
call_once_fn(move || s.len() as i32);
}
Результат выполнения кода:
5
Пример
Давайте посмотрим, как замыкание с перемещением захваченного вектора может быть вызвано только один раз:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let consume = move || v;
let res = consume();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Смотрите также
-
трейт
Fn,
который описывает замыкания, вызываемые многократно без изменения состояния -
трейт
FnMut,
который описывает замыкания, вызываемые многократно с изменением состояния -
трейт
Trait Bound,
который задаёт ограничения на обобщённые типы через трейты -
трейт
impl Trait,
который позволяет указывать трейт в позиции возвращаемого типа