let f: Box<Fn() + Send + 'static> = Box::new(|| println!("hi"));
fn takes_long_type(f: Box<Fn() + Send + 'static>) {
- // ...snip...
+ // --snip--
}
fn returns_long_type() -> Box<Fn() + Send + 'static> {
- // ...snip...
+ // --snip--
# Box::new(|| ())
}
```
let f: Thunk = Box::new(|| println!("hi"));
fn takes_long_type(f: Thunk) {
- // ...snip...
+ // --snip--
}
fn returns_long_type() -> Thunk {
- // ...snip...
+ // --snip--
# Box::new(|| ())
}
```
```rust,ignore
fn bar() -> ! {
- // ...snip...
+ // --snip--
}
```
to compute the type of `guess`, it looks at both of the match arms. The former
has a value of `u32`, and the latter has a value of `!`. Since `!` can never
have a value, Rust is okay with this, and decides that the type of `guess` is
-`u32`. The formal way of describing this behavior of `!` is that the never type
-unifies with all other types. We’re allowed to end this `match` arm with
-`continue` because `continue` doesn’t actually return a value; it instead moves
-control back to the top of the loop, so in the `Err` case, we never actually
-assign a value to `guess`.
+`u32`. The formal way of describing this behavior is that expressions of type
+`!` can be coerced into any other type. We’re allowed to end this `match` arm
+with `continue` because `continue` doesn’t actually return a value; it instead
+moves control back to the top of the loop, so in the `Err` case, we never
+actually assign a value to `guess`.
Another use of the never type is `panic!`. Remember the `unwrap` function that
we call on `Option<T>` values to produce a value or panic? Here’s its
```rust,ignore
fn generic<T>(t: T) {
- // ...snip...
+ // --snip--
}
```
```rust,ignore
fn generic<T: Sized>(t: T) {
- // ...snip...
+ // --snip--
}
```
```rust,ignore
fn generic<T: ?Sized>(t: &T) {
- // ...snip...
+ // --snip--
}
```