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