|
|
|
|
|
by frankmcsherry
3210 days ago
|
|
IANAPLRESEARCHER, but to my understanding, it actually unifies the semantics. The return value is always the result of the last expression, and its type may either be something non-trivial, or `()` which is what `expr;` returns. This makes it easier to write and use generic code for which you don't know the return type (could be `String`, could be `()`), without insisting on special cases for "returns a thing" and "doesn't". Example: I hold a thing of type `T` and want to let you call a function on it. I can write this generically as pub trait WithMut<T> {
fn with_mut<R, F: Fn(&mut T)->R>(&mut self, func: F) -> R;
}
and now with one implementation I can deal both with functions that return meaningful values, and "computations" that do some work but return nothing (other than `()`). |
|