capypad
0 day streak
rust / intermediate
Snippet

impl Trait for Return Type Simplification

impl Trait in return position provides type erasure for functions, simplifying generic signatures. The compiler infers the concrete type at the call site. Combined with function parameters accepting impl Trait, this enables clean abstraction without explicit generic syntax.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fn largest<T: PartialOrd>(slice: &[T]) -> &T {
let mut largest = &slice[0];
for item in slice.iter() {
if item > largest {
largest = item;
}
}
largest
}
 
fn create_filter(predicate: impl Fn(i32) -> bool) -> impl Fn(i32) -> bool {
move |x| predicate(x) && x > 0
}
 
fn main() {
let numbers = vec![1, 5, 3, 8, 2];
let result = largest(&numbers);
println!("Largest: {}", result);
let is_even = |x| x % 2 == 0;
let filter = create_filter(is_even);
println!("10 even and positive: {}", filter(10)); // true
}
Breakdown
1
impl Fn(i32) -> bool
Accepts any closure or function matching this signature - concrete type hidden from callers
2
-> impl Fn(i32) -> bool
Return type uses impl Trait - caller cannot name the type but can use it
3
move |x| predicate(x) && x > 0
Returned closure captures predicate - type is compiler-generated and opaque
4
largest<T: PartialOrd>(&[T]) -> &T
Classic generic function with trait bound for comparison