Skip to content

Commit 88bb691

Browse files
committed
Remove inverse example from generics part of TRPL
Fixes #24325.
1 parent 51b8768 commit 88bb691

File tree

1 file changed

+0
-85
lines changed

1 file changed

+0
-85
lines changed

src/doc/trpl/generics.md

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -90,88 +90,3 @@ if we wanted to. Convention says that the first generic parameter should be
9090

9191
The `Result<T, E>` type is intended to be used to return the result of a
9292
computation, and to have the ability to return an error if it didn't work out.
93-
Here's an example:
94-
95-
```{rust}
96-
let x: Result<f64, String> = Ok(2.3f64);
97-
let y: Result<f64, String> = Err("There was an error.".to_string());
98-
```
99-
100-
This particular Result will return an `f64` if there's a success, and a
101-
`String` if there's a failure. Let's write a function that uses `Result<T, E>`:
102-
103-
```{rust}
104-
fn inverse(x: f64) -> Result<f64, String> {
105-
if x == 0.0f64 { return Err("x cannot be zero!".to_string()); }
106-
107-
Ok(1.0f64 / x)
108-
}
109-
```
110-
111-
We don't want to take the inverse of zero, so we check to make sure that we
112-
weren't passed zero. If we were, then we return an `Err`, with a message. If
113-
it's okay, we return an `Ok`, with the answer.
114-
115-
Why does this matter? Well, remember how `match` does exhaustive matches?
116-
Here's how this function gets used:
117-
118-
```{rust}
119-
# fn inverse(x: f64) -> Result<f64, String> {
120-
# if x == 0.0f64 { return Err("x cannot be zero!".to_string()); }
121-
# Ok(1.0f64 / x)
122-
# }
123-
let x = inverse(25.0f64);
124-
125-
match x {
126-
Ok(x) => println!("The inverse of 25 is {}", x),
127-
Err(msg) => println!("Error: {}", msg),
128-
}
129-
```
130-
131-
The `match` enforces that we handle the `Err` case. In addition, because the
132-
answer is wrapped up in an `Ok`, we can't just use the result without doing
133-
the match:
134-
135-
```{rust,ignore}
136-
let x = inverse(25.0f64);
137-
println!("{}", x + 2.0f64); // error: binary operation `+` cannot be applied
138-
// to type `core::result::Result<f64,collections::string::String>`
139-
```
140-
141-
This function is great, but there's one other problem: it only works for 64 bit
142-
floating point values. What if we wanted to handle 32 bit floating point as
143-
well? We'd have to write this:
144-
145-
```{rust}
146-
fn inverse32(x: f32) -> Result<f32, String> {
147-
if x == 0.0f32 { return Err("x cannot be zero!".to_string()); }
148-
149-
Ok(1.0f32 / x)
150-
}
151-
```
152-
153-
Bummer. What we need is a *generic function*. Luckily, we can write one!
154-
However, it won't _quite_ work yet. Before we get into that, let's talk syntax.
155-
A generic version of `inverse` would look something like this:
156-
157-
```{rust,ignore}
158-
fn inverse<T>(x: T) -> Result<T, String> {
159-
if x == 0.0 { return Err("x cannot be zero!".to_string()); }
160-
161-
Ok(1.0 / x)
162-
}
163-
```
164-
165-
Just like how we had `Option<T>`, we use a similar syntax for `inverse<T>`.
166-
We can then use `T` inside the rest of the signature: `x` has type `T`, and half
167-
of the `Result` has type `T`. However, if we try to compile that example, we'll get
168-
an error:
169-
170-
```text
171-
error: binary operation `==` cannot be applied to type `T`
172-
```
173-
174-
Because `T` can be _any_ type, it may be a type that doesn't implement `==`,
175-
and therefore, the first line would be wrong. What do we do?
176-
177-
To fix this example, we need to learn about another Rust feature: traits.

0 commit comments

Comments
 (0)