Я вижу две разные вещи:
fn for_each<F>(self, f: F) where F: FnMut(Self::Item)
И:
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering where I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering
У одного есть ->
, а у другого нет. Они оба называются Fn
, что заставляет меня думать, что это может быть закрытие. Но я не вижу никаких Примеры.
Что означают предложения where именно в этой ситуации?
Если вы имеете в виду ->
после границы where
, это специальный синтаксис для признака Fn
, F: Fn(A) -> B
означает, что F
— это функция (возможно, замыкание), которая принимает A
и возвращает B
Rust аннотирует тип возвращаемого значения знаком ->
.
fn foo() -> i32 { ... }
Когда функция возвращает ()
, вы можете опустить его для удобства. fn foo() -> () {}
то же, что fn foo() {}
.
То же самое происходит с указателями функций и замыканиями: fn() -> ()
(указатель на функцию, возвращающую ()
) можно записать как просто fn()
, и таким же образом Fn() -> ()
(должно быть частью общего ограничения или dyn
, функции/замыкания, реализующей Fn
черта ) можно записать как просто Fn()
.
Так,
fn for_each<F>(self, f: F) where F: FnMut(Self::Item)
Принимает функцию (или замыкание), которая принимает Self::Item
и ничего не возвращает. И
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering where I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering
Принимает (помимо другого итератора other
) функцию, которая принимает Self::Item
и I::Item
и возвращает Ordering
(std::cmp::Ordering
).
-> SomeType
указывает, что функция возвращаетSomeType
, а предложениеwhere ...
— это отдельный бит синтаксиса, определяющий границы дженериков.