@@ -90,88 +90,3 @@ if we wanted to. Convention says that the first generic parameter should be
9090
9191The ` Result<T, E> ` type is intended to be used to return the result of a
9292computation, 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