1 | //! Traits for conversions between types. |
2 | //! |
3 | //! The traits in this module provide a way to convert from one type to another type. |
4 | //! Each trait serves a different purpose: |
5 | //! |
6 | //! - Implement the [`AsRef`] trait for cheap reference-to-reference conversions |
7 | //! - Implement the [`AsMut`] trait for cheap mutable-to-mutable conversions |
8 | //! - Implement the [`From`] trait for consuming value-to-value conversions |
9 | //! - Implement the [`Into`] trait for consuming value-to-value conversions to types |
10 | //! outside the current crate |
11 | //! - The [`TryFrom`] and [`TryInto`] traits behave like [`From`] and [`Into`], |
12 | //! but should be implemented when the conversion can fail. |
13 | //! |
14 | //! The traits in this module are often used as trait bounds for generic functions such that to |
15 | //! arguments of multiple types are supported. See the documentation of each trait for examples. |
16 | //! |
17 | //! As a library author, you should always prefer implementing [`From<T>`][`From`] or |
18 | //! [`TryFrom<T>`][`TryFrom`] rather than [`Into<U>`][`Into`] or [`TryInto<U>`][`TryInto`], |
19 | //! as [`From`] and [`TryFrom`] provide greater flexibility and offer |
20 | //! equivalent [`Into`] or [`TryInto`] implementations for free, thanks to a |
21 | //! blanket implementation in the standard library. When targeting a version prior to Rust 1.41, it |
22 | //! may be necessary to implement [`Into`] or [`TryInto`] directly when converting to a type |
23 | //! outside the current crate. |
24 | //! |
25 | //! # Generic Implementations |
26 | //! |
27 | //! - [`AsRef`] and [`AsMut`] auto-dereference if the inner type is a reference |
28 | //! (but not generally for all [dereferenceable types][core::ops::Deref]) |
29 | //! - [`From`]`<U> for T` implies [`Into`]`<T> for U` |
30 | //! - [`TryFrom`]`<U> for T` implies [`TryInto`]`<T> for U` |
31 | //! - [`From`] and [`Into`] are reflexive, which means that all types can |
32 | //! `into` themselves and `from` themselves |
33 | //! |
34 | //! See each trait for usage examples. |
35 | |
36 | #![stable (feature = "rust1" , since = "1.0.0" )] |
37 | |
38 | use crate::error::Error; |
39 | use crate::fmt; |
40 | use crate::hash::{Hash, Hasher}; |
41 | |
42 | mod num; |
43 | |
44 | #[unstable (feature = "convert_float_to_int" , issue = "67057" )] |
45 | pub use num::FloatToInt; |
46 | |
47 | /// The identity function. |
48 | /// |
49 | /// Two things are important to note about this function: |
50 | /// |
51 | /// - It is not always equivalent to a closure like `|x| x`, since the |
52 | /// closure may coerce `x` into a different type. |
53 | /// |
54 | /// - It moves the input `x` passed to the function. |
55 | /// |
56 | /// While it might seem strange to have a function that just returns back the |
57 | /// input, there are some interesting uses. |
58 | /// |
59 | /// # Examples |
60 | /// |
61 | /// Using `identity` to do nothing in a sequence of other, interesting, |
62 | /// functions: |
63 | /// |
64 | /// ```rust |
65 | /// use std::convert::identity; |
66 | /// |
67 | /// fn manipulation(x: u32) -> u32 { |
68 | /// // Let's pretend that adding one is an interesting function. |
69 | /// x + 1 |
70 | /// } |
71 | /// |
72 | /// let _arr = &[identity, manipulation]; |
73 | /// ``` |
74 | /// |
75 | /// Using `identity` as a "do nothing" base case in a conditional: |
76 | /// |
77 | /// ```rust |
78 | /// use std::convert::identity; |
79 | /// |
80 | /// # let condition = true; |
81 | /// # |
82 | /// # fn manipulation(x: u32) -> u32 { x + 1 } |
83 | /// # |
84 | /// let do_stuff = if condition { manipulation } else { identity }; |
85 | /// |
86 | /// // Do more interesting stuff... |
87 | /// |
88 | /// let _results = do_stuff(42); |
89 | /// ``` |
90 | /// |
91 | /// Using `identity` to keep the `Some` variants of an iterator of `Option<T>`: |
92 | /// |
93 | /// ```rust |
94 | /// use std::convert::identity; |
95 | /// |
96 | /// let iter = [Some(1), None, Some(3)].into_iter(); |
97 | /// let filtered = iter.filter_map(identity).collect::<Vec<_>>(); |
98 | /// assert_eq!(vec![1, 3], filtered); |
99 | /// ``` |
100 | #[stable (feature = "convert_id" , since = "1.33.0" )] |
101 | #[rustc_const_stable (feature = "const_identity" , since = "1.33.0" )] |
102 | #[inline (always)] |
103 | #[rustc_diagnostic_item = "convert_identity" ] |
104 | pub const fn identity<T>(x: T) -> T { |
105 | x |
106 | } |
107 | |
108 | /// Used to do a cheap reference-to-reference conversion. |
109 | /// |
110 | /// This trait is similar to [`AsMut`] which is used for converting between mutable references. |
111 | /// If you need to do a costly conversion it is better to implement [`From`] with type |
112 | /// `&T` or write a custom function. |
113 | /// |
114 | /// # Relation to `Borrow` |
115 | /// |
116 | /// `AsRef` has the same signature as [`Borrow`], but [`Borrow`] is different in a few aspects: |
117 | /// |
118 | /// - Unlike `AsRef`, [`Borrow`] has a blanket impl for any `T`, and can be used to accept either |
119 | /// a reference or a value. (See also note on `AsRef`'s reflexibility below.) |
120 | /// - [`Borrow`] also requires that [`Hash`], [`Eq`] and [`Ord`] for a borrowed value are |
121 | /// equivalent to those of the owned value. For this reason, if you want to |
122 | /// borrow only a single field of a struct you can implement `AsRef`, but not [`Borrow`]. |
123 | /// |
124 | /// **Note: This trait must not fail**. If the conversion can fail, use a |
125 | /// dedicated method which returns an [`Option<T>`] or a [`Result<T, E>`]. |
126 | /// |
127 | /// # Generic Implementations |
128 | /// |
129 | /// `AsRef` auto-dereferences if the inner type is a reference or a mutable reference |
130 | /// (e.g.: `foo.as_ref()` will work the same if `foo` has type `&mut Foo` or `&&mut Foo`). |
131 | /// |
132 | /// Note that due to historic reasons, the above currently does not hold generally for all |
133 | /// [dereferenceable types], e.g. `foo.as_ref()` will *not* work the same as |
134 | /// `Box::new(foo).as_ref()`. Instead, many smart pointers provide an `as_ref` implementation which |
135 | /// simply returns a reference to the [pointed-to value] (but do not perform a cheap |
136 | /// reference-to-reference conversion for that value). However, [`AsRef::as_ref`] should not be |
137 | /// used for the sole purpose of dereferencing; instead ['`Deref` coercion'] can be used: |
138 | /// |
139 | /// [dereferenceable types]: core::ops::Deref |
140 | /// [pointed-to value]: core::ops::Deref::Target |
141 | /// ['`Deref` coercion']: core::ops::Deref#deref-coercion |
142 | /// |
143 | /// ``` |
144 | /// let x = Box::new(5i32); |
145 | /// // Avoid this: |
146 | /// // let y: &i32 = x.as_ref(); |
147 | /// // Better just write: |
148 | /// let y: &i32 = &x; |
149 | /// ``` |
150 | /// |
151 | /// Types which implement [`Deref`] should consider implementing `AsRef<T>` as follows: |
152 | /// |
153 | /// [`Deref`]: core::ops::Deref |
154 | /// |
155 | /// ``` |
156 | /// # use core::ops::Deref; |
157 | /// # struct SomeType; |
158 | /// # impl Deref for SomeType { |
159 | /// # type Target = [u8]; |
160 | /// # fn deref(&self) -> &[u8] { |
161 | /// # &[] |
162 | /// # } |
163 | /// # } |
164 | /// impl<T> AsRef<T> for SomeType |
165 | /// where |
166 | /// T: ?Sized, |
167 | /// <SomeType as Deref>::Target: AsRef<T>, |
168 | /// { |
169 | /// fn as_ref(&self) -> &T { |
170 | /// self.deref().as_ref() |
171 | /// } |
172 | /// } |
173 | /// ``` |
174 | /// |
175 | /// # Reflexivity |
176 | /// |
177 | /// Ideally, `AsRef` would be reflexive, i.e. there would be an `impl<T: ?Sized> AsRef<T> for T` |
178 | /// with [`as_ref`] simply returning its argument unchanged. |
179 | /// Such a blanket implementation is currently *not* provided due to technical restrictions of |
180 | /// Rust's type system (it would be overlapping with another existing blanket implementation for |
181 | /// `&T where T: AsRef<U>` which allows `AsRef` to auto-dereference, see "Generic Implementations" |
182 | /// above). |
183 | /// |
184 | /// [`as_ref`]: AsRef::as_ref |
185 | /// |
186 | /// A trivial implementation of `AsRef<T> for T` must be added explicitly for a particular type `T` |
187 | /// where needed or desired. Note, however, that not all types from `std` contain such an |
188 | /// implementation, and those cannot be added by external code due to orphan rules. |
189 | /// |
190 | /// # Examples |
191 | /// |
192 | /// By using trait bounds we can accept arguments of different types as long as they can be |
193 | /// converted to the specified type `T`. |
194 | /// |
195 | /// For example: By creating a generic function that takes an `AsRef<str>` we express that we |
196 | /// want to accept all references that can be converted to [`&str`] as an argument. |
197 | /// Since both [`String`] and [`&str`] implement `AsRef<str>` we can accept both as input argument. |
198 | /// |
199 | /// [`&str`]: primitive@str |
200 | /// [`Borrow`]: crate::borrow::Borrow |
201 | /// [`Eq`]: crate::cmp::Eq |
202 | /// [`Ord`]: crate::cmp::Ord |
203 | /// [`String`]: ../../std/string/struct.String.html |
204 | /// |
205 | /// ``` |
206 | /// fn is_hello<T: AsRef<str>>(s: T) { |
207 | /// assert_eq!("hello" , s.as_ref()); |
208 | /// } |
209 | /// |
210 | /// let s = "hello" ; |
211 | /// is_hello(s); |
212 | /// |
213 | /// let s = "hello" .to_string(); |
214 | /// is_hello(s); |
215 | /// ``` |
216 | #[stable (feature = "rust1" , since = "1.0.0" )] |
217 | #[cfg_attr (not(test), rustc_diagnostic_item = "AsRef" )] |
218 | pub trait AsRef<T: ?Sized> { |
219 | /// Converts this type into a shared reference of the (usually inferred) input type. |
220 | #[stable (feature = "rust1" , since = "1.0.0" )] |
221 | fn as_ref(&self) -> &T; |
222 | } |
223 | |
224 | /// Used to do a cheap mutable-to-mutable reference conversion. |
225 | /// |
226 | /// This trait is similar to [`AsRef`] but used for converting between mutable |
227 | /// references. If you need to do a costly conversion it is better to |
228 | /// implement [`From`] with type `&mut T` or write a custom function. |
229 | /// |
230 | /// **Note: This trait must not fail**. If the conversion can fail, use a |
231 | /// dedicated method which returns an [`Option<T>`] or a [`Result<T, E>`]. |
232 | /// |
233 | /// # Generic Implementations |
234 | /// |
235 | /// `AsMut` auto-dereferences if the inner type is a mutable reference |
236 | /// (e.g.: `foo.as_mut()` will work the same if `foo` has type `&mut Foo` or `&mut &mut Foo`). |
237 | /// |
238 | /// Note that due to historic reasons, the above currently does not hold generally for all |
239 | /// [mutably dereferenceable types], e.g. `foo.as_mut()` will *not* work the same as |
240 | /// `Box::new(foo).as_mut()`. Instead, many smart pointers provide an `as_mut` implementation which |
241 | /// simply returns a reference to the [pointed-to value] (but do not perform a cheap |
242 | /// reference-to-reference conversion for that value). However, [`AsMut::as_mut`] should not be |
243 | /// used for the sole purpose of mutable dereferencing; instead ['`Deref` coercion'] can be used: |
244 | /// |
245 | /// [mutably dereferenceable types]: core::ops::DerefMut |
246 | /// [pointed-to value]: core::ops::Deref::Target |
247 | /// ['`Deref` coercion']: core::ops::DerefMut#mutable-deref-coercion |
248 | /// |
249 | /// ``` |
250 | /// let mut x = Box::new(5i32); |
251 | /// // Avoid this: |
252 | /// // let y: &mut i32 = x.as_mut(); |
253 | /// // Better just write: |
254 | /// let y: &mut i32 = &mut x; |
255 | /// ``` |
256 | /// |
257 | /// Types which implement [`DerefMut`] should consider to add an implementation of `AsMut<T>` as |
258 | /// follows: |
259 | /// |
260 | /// [`DerefMut`]: core::ops::DerefMut |
261 | /// |
262 | /// ``` |
263 | /// # use core::ops::{Deref, DerefMut}; |
264 | /// # struct SomeType; |
265 | /// # impl Deref for SomeType { |
266 | /// # type Target = [u8]; |
267 | /// # fn deref(&self) -> &[u8] { |
268 | /// # &[] |
269 | /// # } |
270 | /// # } |
271 | /// # impl DerefMut for SomeType { |
272 | /// # fn deref_mut(&mut self) -> &mut [u8] { |
273 | /// # &mut [] |
274 | /// # } |
275 | /// # } |
276 | /// impl<T> AsMut<T> for SomeType |
277 | /// where |
278 | /// <SomeType as Deref>::Target: AsMut<T>, |
279 | /// { |
280 | /// fn as_mut(&mut self) -> &mut T { |
281 | /// self.deref_mut().as_mut() |
282 | /// } |
283 | /// } |
284 | /// ``` |
285 | /// |
286 | /// # Reflexivity |
287 | /// |
288 | /// Ideally, `AsMut` would be reflexive, i.e. there would be an `impl<T: ?Sized> AsMut<T> for T` |
289 | /// with [`as_mut`] simply returning its argument unchanged. |
290 | /// Such a blanket implementation is currently *not* provided due to technical restrictions of |
291 | /// Rust's type system (it would be overlapping with another existing blanket implementation for |
292 | /// `&mut T where T: AsMut<U>` which allows `AsMut` to auto-dereference, see "Generic |
293 | /// Implementations" above). |
294 | /// |
295 | /// [`as_mut`]: AsMut::as_mut |
296 | /// |
297 | /// A trivial implementation of `AsMut<T> for T` must be added explicitly for a particular type `T` |
298 | /// where needed or desired. Note, however, that not all types from `std` contain such an |
299 | /// implementation, and those cannot be added by external code due to orphan rules. |
300 | /// |
301 | /// # Examples |
302 | /// |
303 | /// Using `AsMut` as trait bound for a generic function, we can accept all mutable references that |
304 | /// can be converted to type `&mut T`. Unlike [dereference], which has a single [target type], |
305 | /// there can be multiple implementations of `AsMut` for a type. In particular, `Vec<T>` implements |
306 | /// both `AsMut<Vec<T>>` and `AsMut<[T]>`. |
307 | /// |
308 | /// In the following, the example functions `caesar` and `null_terminate` provide a generic |
309 | /// interface which work with any type that can be converted by cheap mutable-to-mutable conversion |
310 | /// into a byte slice (`[u8]`) or byte vector (`Vec<u8>`), respectively. |
311 | /// |
312 | /// [dereference]: core::ops::DerefMut |
313 | /// [target type]: core::ops::Deref::Target |
314 | /// |
315 | /// ``` |
316 | /// struct Document { |
317 | /// info: String, |
318 | /// content: Vec<u8>, |
319 | /// } |
320 | /// |
321 | /// impl<T: ?Sized> AsMut<T> for Document |
322 | /// where |
323 | /// Vec<u8>: AsMut<T>, |
324 | /// { |
325 | /// fn as_mut(&mut self) -> &mut T { |
326 | /// self.content.as_mut() |
327 | /// } |
328 | /// } |
329 | /// |
330 | /// fn caesar<T: AsMut<[u8]>>(data: &mut T, key: u8) { |
331 | /// for byte in data.as_mut() { |
332 | /// *byte = byte.wrapping_add(key); |
333 | /// } |
334 | /// } |
335 | /// |
336 | /// fn null_terminate<T: AsMut<Vec<u8>>>(data: &mut T) { |
337 | /// // Using a non-generic inner function, which contains most of the |
338 | /// // functionality, helps to minimize monomorphization overhead. |
339 | /// fn doit(data: &mut Vec<u8>) { |
340 | /// let len = data.len(); |
341 | /// if len == 0 || data[len-1] != 0 { |
342 | /// data.push(0); |
343 | /// } |
344 | /// } |
345 | /// doit(data.as_mut()); |
346 | /// } |
347 | /// |
348 | /// fn main() { |
349 | /// let mut v: Vec<u8> = vec![1, 2, 3]; |
350 | /// caesar(&mut v, 5); |
351 | /// assert_eq!(v, [6, 7, 8]); |
352 | /// null_terminate(&mut v); |
353 | /// assert_eq!(v, [6, 7, 8, 0]); |
354 | /// let mut doc = Document { |
355 | /// info: String::from("Example" ), |
356 | /// content: vec![17, 19, 8], |
357 | /// }; |
358 | /// caesar(&mut doc, 1); |
359 | /// assert_eq!(doc.content, [18, 20, 9]); |
360 | /// null_terminate(&mut doc); |
361 | /// assert_eq!(doc.content, [18, 20, 9, 0]); |
362 | /// } |
363 | /// ``` |
364 | /// |
365 | /// Note, however, that APIs don't need to be generic. In many cases taking a `&mut [u8]` or |
366 | /// `&mut Vec<u8>`, for example, is the better choice (callers need to pass the correct type then). |
367 | #[stable (feature = "rust1" , since = "1.0.0" )] |
368 | #[cfg_attr (not(test), rustc_diagnostic_item = "AsMut" )] |
369 | pub trait AsMut<T: ?Sized> { |
370 | /// Converts this type into a mutable reference of the (usually inferred) input type. |
371 | #[stable (feature = "rust1" , since = "1.0.0" )] |
372 | fn as_mut(&mut self) -> &mut T; |
373 | } |
374 | |
375 | /// A value-to-value conversion that consumes the input value. The |
376 | /// opposite of [`From`]. |
377 | /// |
378 | /// One should avoid implementing [`Into`] and implement [`From`] instead. |
379 | /// Implementing [`From`] automatically provides one with an implementation of [`Into`] |
380 | /// thanks to the blanket implementation in the standard library. |
381 | /// |
382 | /// Prefer using [`Into`] over [`From`] when specifying trait bounds on a generic function |
383 | /// to ensure that types that only implement [`Into`] can be used as well. |
384 | /// |
385 | /// **Note: This trait must not fail**. If the conversion can fail, use [`TryInto`]. |
386 | /// |
387 | /// # Generic Implementations |
388 | /// |
389 | /// - [`From`]`<T> for U` implies `Into<U> for T` |
390 | /// - [`Into`] is reflexive, which means that `Into<T> for T` is implemented |
391 | /// |
392 | /// # Implementing [`Into`] for conversions to external types in old versions of Rust |
393 | /// |
394 | /// Prior to Rust 1.41, if the destination type was not part of the current crate |
395 | /// then you couldn't implement [`From`] directly. |
396 | /// For example, take this code: |
397 | /// |
398 | /// ``` |
399 | /// struct Wrapper<T>(Vec<T>); |
400 | /// impl<T> From<Wrapper<T>> for Vec<T> { |
401 | /// fn from(w: Wrapper<T>) -> Vec<T> { |
402 | /// w.0 |
403 | /// } |
404 | /// } |
405 | /// ``` |
406 | /// This will fail to compile in older versions of the language because Rust's orphaning rules |
407 | /// used to be a little bit more strict. To bypass this, you could implement [`Into`] directly: |
408 | /// |
409 | /// ``` |
410 | /// struct Wrapper<T>(Vec<T>); |
411 | /// impl<T> Into<Vec<T>> for Wrapper<T> { |
412 | /// fn into(self) -> Vec<T> { |
413 | /// self.0 |
414 | /// } |
415 | /// } |
416 | /// ``` |
417 | /// |
418 | /// It is important to understand that [`Into`] does not provide a [`From`] implementation |
419 | /// (as [`From`] does with [`Into`]). Therefore, you should always try to implement [`From`] |
420 | /// and then fall back to [`Into`] if [`From`] can't be implemented. |
421 | /// |
422 | /// # Examples |
423 | /// |
424 | /// [`String`] implements [`Into`]`<`[`Vec`]`<`[`u8`]`>>`: |
425 | /// |
426 | /// In order to express that we want a generic function to take all arguments that can be |
427 | /// converted to a specified type `T`, we can use a trait bound of [`Into`]`<T>`. |
428 | /// For example: The function `is_hello` takes all arguments that can be converted into a |
429 | /// [`Vec`]`<`[`u8`]`>`. |
430 | /// |
431 | /// ``` |
432 | /// fn is_hello<T: Into<Vec<u8>>>(s: T) { |
433 | /// let bytes = b"hello" .to_vec(); |
434 | /// assert_eq!(bytes, s.into()); |
435 | /// } |
436 | /// |
437 | /// let s = "hello" .to_string(); |
438 | /// is_hello(s); |
439 | /// ``` |
440 | /// |
441 | /// [`String`]: ../../std/string/struct.String.html |
442 | /// [`Vec`]: ../../std/vec/struct.Vec.html |
443 | #[rustc_diagnostic_item = "Into" ] |
444 | #[stable (feature = "rust1" , since = "1.0.0" )] |
445 | pub trait Into<T>: Sized { |
446 | /// Converts this type into the (usually inferred) input type. |
447 | #[must_use ] |
448 | #[stable (feature = "rust1" , since = "1.0.0" )] |
449 | fn into(self) -> T; |
450 | } |
451 | |
452 | /// Used to do value-to-value conversions while consuming the input value. It is the reciprocal of |
453 | /// [`Into`]. |
454 | /// |
455 | /// One should always prefer implementing `From` over [`Into`] |
456 | /// because implementing `From` automatically provides one with an implementation of [`Into`] |
457 | /// thanks to the blanket implementation in the standard library. |
458 | /// |
459 | /// Only implement [`Into`] when targeting a version prior to Rust 1.41 and converting to a type |
460 | /// outside the current crate. |
461 | /// `From` was not able to do these types of conversions in earlier versions because of Rust's |
462 | /// orphaning rules. |
463 | /// See [`Into`] for more details. |
464 | /// |
465 | /// Prefer using [`Into`] over using `From` when specifying trait bounds on a generic function. |
466 | /// This way, types that directly implement [`Into`] can be used as arguments as well. |
467 | /// |
468 | /// The `From` is also very useful when performing error handling. When constructing a function |
469 | /// that is capable of failing, the return type will generally be of the form `Result<T, E>`. |
470 | /// The `From` trait simplifies error handling by allowing a function to return a single error type |
471 | /// that encapsulate multiple error types. See the "Examples" section and [the book][book] for more |
472 | /// details. |
473 | /// |
474 | /// **Note: This trait must not fail**. The `From` trait is intended for perfect conversions. |
475 | /// If the conversion can fail or is not perfect, use [`TryFrom`]. |
476 | /// |
477 | /// # Generic Implementations |
478 | /// |
479 | /// - `From<T> for U` implies [`Into`]`<U> for T` |
480 | /// - `From` is reflexive, which means that `From<T> for T` is implemented |
481 | /// |
482 | /// # When to implement `From` |
483 | /// |
484 | /// While there's no technical restrictions on which conversions can be done using |
485 | /// a `From` implementation, the general expectation is that the conversions |
486 | /// should typically be restricted as follows: |
487 | /// |
488 | /// * The conversion is *infallible*: if the conversion can fail, use [`TryFrom`] |
489 | /// instead; don't provide a `From` impl that panics. |
490 | /// |
491 | /// * The conversion is *lossless*: semantically, it should not lose or discard |
492 | /// information. For example, `i32: From<u16>` exists, where the original |
493 | /// value can be recovered using `u16: TryFrom<i32>`. And `String: From<&str>` |
494 | /// exists, where you can get something equivalent to the original value via |
495 | /// `Deref`. But `From` cannot be used to convert from `u32` to `u16`, since |
496 | /// that cannot succeed in a lossless way. (There's some wiggle room here for |
497 | /// information not considered semantically relevant. For example, |
498 | /// `Box<[T]>: From<Vec<T>>` exists even though it might not preserve capacity, |
499 | /// like how two vectors can be equal despite differing capacities.) |
500 | /// |
501 | /// * The conversion is *value-preserving*: the conceptual kind and meaning of |
502 | /// the resulting value is the same, even though the Rust type and technical |
503 | /// representation might be different. For example `-1_i8 as u8` is *lossless*, |
504 | /// since `as` casting back can recover the original value, but that conversion |
505 | /// is *not* available via `From` because `-1` and `255` are different conceptual |
506 | /// values (despite being identical bit patterns technically). But |
507 | /// `f32: From<i16>` *is* available because `1_i16` and `1.0_f32` are conceptually |
508 | /// the same real number (despite having very different bit patterns technically). |
509 | /// `String: From<char>` is available because they're both *text*, but |
510 | /// `String: From<u32>` is *not* available, since `1` (a number) and `"1"` |
511 | /// (text) are too different. (Converting values to text is instead covered |
512 | /// by the [`Display`](crate::fmt::Display) trait.) |
513 | /// |
514 | /// * The conversion is *obvious*: it's the only reasonable conversion between |
515 | /// the two types. Otherwise it's better to have it be a named method or |
516 | /// constructor, like how [`str::as_bytes`] is a method and how integers have |
517 | /// methods like [`u32::from_ne_bytes`], [`u32::from_le_bytes`], and |
518 | /// [`u32::from_be_bytes`], none of which are `From` implementations. Whereas |
519 | /// there's only one reasonable way to wrap an [`Ipv6Addr`](crate::net::Ipv6Addr) |
520 | /// into an [`IpAddr`](crate::net::IpAddr), thus `IpAddr: From<Ipv6Addr>` exists. |
521 | /// |
522 | /// # Examples |
523 | /// |
524 | /// [`String`] implements `From<&str>`: |
525 | /// |
526 | /// An explicit conversion from a `&str` to a String is done as follows: |
527 | /// |
528 | /// ``` |
529 | /// let string = "hello" .to_string(); |
530 | /// let other_string = String::from("hello" ); |
531 | /// |
532 | /// assert_eq!(string, other_string); |
533 | /// ``` |
534 | /// |
535 | /// While performing error handling it is often useful to implement `From` for your own error type. |
536 | /// By converting underlying error types to our own custom error type that encapsulates the |
537 | /// underlying error type, we can return a single error type without losing information on the |
538 | /// underlying cause. The '?' operator automatically converts the underlying error type to our |
539 | /// custom error type with `From::from`. |
540 | /// |
541 | /// ``` |
542 | /// use std::fs; |
543 | /// use std::io; |
544 | /// use std::num; |
545 | /// |
546 | /// enum CliError { |
547 | /// IoError(io::Error), |
548 | /// ParseError(num::ParseIntError), |
549 | /// } |
550 | /// |
551 | /// impl From<io::Error> for CliError { |
552 | /// fn from(error: io::Error) -> Self { |
553 | /// CliError::IoError(error) |
554 | /// } |
555 | /// } |
556 | /// |
557 | /// impl From<num::ParseIntError> for CliError { |
558 | /// fn from(error: num::ParseIntError) -> Self { |
559 | /// CliError::ParseError(error) |
560 | /// } |
561 | /// } |
562 | /// |
563 | /// fn open_and_parse_file(file_name: &str) -> Result<i32, CliError> { |
564 | /// let mut contents = fs::read_to_string(&file_name)?; |
565 | /// let num: i32 = contents.trim().parse()?; |
566 | /// Ok(num) |
567 | /// } |
568 | /// ``` |
569 | /// |
570 | /// [`String`]: ../../std/string/struct.String.html |
571 | /// [`from`]: From::from |
572 | /// [book]: ../../book/ch09-00-error-handling.html |
573 | #[rustc_diagnostic_item = "From" ] |
574 | #[stable (feature = "rust1" , since = "1.0.0" )] |
575 | #[rustc_on_unimplemented (on( |
576 | all(_Self = "&str" , T = "alloc::string::String" ), |
577 | note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix" , |
578 | ))] |
579 | pub trait From<T>: Sized { |
580 | /// Converts to this type from the input type. |
581 | #[rustc_diagnostic_item = "from_fn" ] |
582 | #[must_use ] |
583 | #[stable (feature = "rust1" , since = "1.0.0" )] |
584 | fn from(value: T) -> Self; |
585 | } |
586 | |
587 | /// An attempted conversion that consumes `self`, which may or may not be |
588 | /// expensive. |
589 | /// |
590 | /// Library authors should usually not directly implement this trait, |
591 | /// but should prefer implementing the [`TryFrom`] trait, which offers |
592 | /// greater flexibility and provides an equivalent `TryInto` |
593 | /// implementation for free, thanks to a blanket implementation in the |
594 | /// standard library. For more information on this, see the |
595 | /// documentation for [`Into`]. |
596 | /// |
597 | /// # Implementing `TryInto` |
598 | /// |
599 | /// This suffers the same restrictions and reasoning as implementing |
600 | /// [`Into`], see there for details. |
601 | #[rustc_diagnostic_item = "TryInto" ] |
602 | #[stable (feature = "try_from" , since = "1.34.0" )] |
603 | pub trait TryInto<T>: Sized { |
604 | /// The type returned in the event of a conversion error. |
605 | #[stable (feature = "try_from" , since = "1.34.0" )] |
606 | type Error; |
607 | |
608 | /// Performs the conversion. |
609 | #[stable (feature = "try_from" , since = "1.34.0" )] |
610 | fn try_into(self) -> Result<T, Self::Error>; |
611 | } |
612 | |
613 | /// Simple and safe type conversions that may fail in a controlled |
614 | /// way under some circumstances. It is the reciprocal of [`TryInto`]. |
615 | /// |
616 | /// This is useful when you are doing a type conversion that may |
617 | /// trivially succeed but may also need special handling. |
618 | /// For example, there is no way to convert an [`i64`] into an [`i32`] |
619 | /// using the [`From`] trait, because an [`i64`] may contain a value |
620 | /// that an [`i32`] cannot represent and so the conversion would lose data. |
621 | /// This might be handled by truncating the [`i64`] to an [`i32`] or by |
622 | /// simply returning [`i32::MAX`], or by some other method. The [`From`] |
623 | /// trait is intended for perfect conversions, so the `TryFrom` trait |
624 | /// informs the programmer when a type conversion could go bad and lets |
625 | /// them decide how to handle it. |
626 | /// |
627 | /// # Generic Implementations |
628 | /// |
629 | /// - `TryFrom<T> for U` implies [`TryInto`]`<U> for T` |
630 | /// - [`try_from`] is reflexive, which means that `TryFrom<T> for T` |
631 | /// is implemented and cannot fail -- the associated `Error` type for |
632 | /// calling `T::try_from()` on a value of type `T` is [`Infallible`]. |
633 | /// When the [`!`] type is stabilized [`Infallible`] and [`!`] will be |
634 | /// equivalent. |
635 | /// |
636 | /// `TryFrom<T>` can be implemented as follows: |
637 | /// |
638 | /// ``` |
639 | /// struct GreaterThanZero(i32); |
640 | /// |
641 | /// impl TryFrom<i32> for GreaterThanZero { |
642 | /// type Error = &'static str; |
643 | /// |
644 | /// fn try_from(value: i32) -> Result<Self, Self::Error> { |
645 | /// if value <= 0 { |
646 | /// Err("GreaterThanZero only accepts values greater than zero!" ) |
647 | /// } else { |
648 | /// Ok(GreaterThanZero(value)) |
649 | /// } |
650 | /// } |
651 | /// } |
652 | /// ``` |
653 | /// |
654 | /// # Examples |
655 | /// |
656 | /// As described, [`i32`] implements `TryFrom<`[`i64`]`>`: |
657 | /// |
658 | /// ``` |
659 | /// let big_number = 1_000_000_000_000i64; |
660 | /// // Silently truncates `big_number`, requires detecting |
661 | /// // and handling the truncation after the fact. |
662 | /// let smaller_number = big_number as i32; |
663 | /// assert_eq!(smaller_number, -727379968); |
664 | /// |
665 | /// // Returns an error because `big_number` is too big to |
666 | /// // fit in an `i32`. |
667 | /// let try_smaller_number = i32::try_from(big_number); |
668 | /// assert!(try_smaller_number.is_err()); |
669 | /// |
670 | /// // Returns `Ok(3)`. |
671 | /// let try_successful_smaller_number = i32::try_from(3); |
672 | /// assert!(try_successful_smaller_number.is_ok()); |
673 | /// ``` |
674 | /// |
675 | /// [`try_from`]: TryFrom::try_from |
676 | #[rustc_diagnostic_item = "TryFrom" ] |
677 | #[stable (feature = "try_from" , since = "1.34.0" )] |
678 | pub trait TryFrom<T>: Sized { |
679 | /// The type returned in the event of a conversion error. |
680 | #[stable (feature = "try_from" , since = "1.34.0" )] |
681 | type Error; |
682 | |
683 | /// Performs the conversion. |
684 | #[stable (feature = "try_from" , since = "1.34.0" )] |
685 | #[rustc_diagnostic_item = "try_from_fn" ] |
686 | fn try_from(value: T) -> Result<Self, Self::Error>; |
687 | } |
688 | |
689 | //////////////////////////////////////////////////////////////////////////////// |
690 | // GENERIC IMPLS |
691 | //////////////////////////////////////////////////////////////////////////////// |
692 | |
693 | // As lifts over & |
694 | #[stable (feature = "rust1" , since = "1.0.0" )] |
695 | impl<T: ?Sized, U: ?Sized> AsRef<U> for &T |
696 | where |
697 | T: AsRef<U>, |
698 | { |
699 | #[inline ] |
700 | fn as_ref(&self) -> &U { |
701 | <T as AsRef<U>>::as_ref(*self) |
702 | } |
703 | } |
704 | |
705 | // As lifts over &mut |
706 | #[stable (feature = "rust1" , since = "1.0.0" )] |
707 | impl<T: ?Sized, U: ?Sized> AsRef<U> for &mut T |
708 | where |
709 | T: AsRef<U>, |
710 | { |
711 | #[inline ] |
712 | fn as_ref(&self) -> &U { |
713 | <T as AsRef<U>>::as_ref(*self) |
714 | } |
715 | } |
716 | |
717 | // FIXME (#45742): replace the above impls for &/&mut with the following more general one: |
718 | // // As lifts over Deref |
719 | // impl<D: ?Sized + Deref<Target: AsRef<U>>, U: ?Sized> AsRef<U> for D { |
720 | // fn as_ref(&self) -> &U { |
721 | // self.deref().as_ref() |
722 | // } |
723 | // } |
724 | |
725 | // AsMut lifts over &mut |
726 | #[stable (feature = "rust1" , since = "1.0.0" )] |
727 | impl<T: ?Sized, U: ?Sized> AsMut<U> for &mut T |
728 | where |
729 | T: AsMut<U>, |
730 | { |
731 | #[inline ] |
732 | fn as_mut(&mut self) -> &mut U { |
733 | (*self).as_mut() |
734 | } |
735 | } |
736 | |
737 | // FIXME (#45742): replace the above impl for &mut with the following more general one: |
738 | // // AsMut lifts over DerefMut |
739 | // impl<D: ?Sized + Deref<Target: AsMut<U>>, U: ?Sized> AsMut<U> for D { |
740 | // fn as_mut(&mut self) -> &mut U { |
741 | // self.deref_mut().as_mut() |
742 | // } |
743 | // } |
744 | |
745 | // From implies Into |
746 | #[stable (feature = "rust1" , since = "1.0.0" )] |
747 | impl<T, U> Into<U> for T |
748 | where |
749 | U: From<T>, |
750 | { |
751 | /// Calls `U::from(self)`. |
752 | /// |
753 | /// That is, this conversion is whatever the implementation of |
754 | /// <code>[From]<T> for U</code> chooses to do. |
755 | #[inline ] |
756 | #[track_caller ] |
757 | fn into(self) -> U { |
758 | U::from(self) |
759 | } |
760 | } |
761 | |
762 | // From (and thus Into) is reflexive |
763 | #[stable (feature = "rust1" , since = "1.0.0" )] |
764 | impl<T> From<T> for T { |
765 | /// Returns the argument unchanged. |
766 | #[inline (always)] |
767 | fn from(t: T) -> T { |
768 | t |
769 | } |
770 | } |
771 | |
772 | /// **Stability note:** This impl does not yet exist, but we are |
773 | /// "reserving space" to add it in the future. See |
774 | /// [rust-lang/rust#64715][#64715] for details. |
775 | /// |
776 | /// [#64715]: https://github.com/rust-lang/rust/issues/64715 |
777 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
778 | #[allow (unused_attributes)] // FIXME(#58633): do a principled fix instead. |
779 | #[rustc_reservation_impl = "permitting this impl would forbid us from adding \ |
780 | `impl<T> From<!> for T` later; see rust-lang/rust#64715 for details" ] |
781 | impl<T> From<!> for T { |
782 | fn from(t: !) -> T { |
783 | t |
784 | } |
785 | } |
786 | |
787 | // TryFrom implies TryInto |
788 | #[stable (feature = "try_from" , since = "1.34.0" )] |
789 | impl<T, U> TryInto<U> for T |
790 | where |
791 | U: TryFrom<T>, |
792 | { |
793 | type Error = U::Error; |
794 | |
795 | #[inline ] |
796 | fn try_into(self) -> Result<U, U::Error> { |
797 | U::try_from(self) |
798 | } |
799 | } |
800 | |
801 | // Infallible conversions are semantically equivalent to fallible conversions |
802 | // with an uninhabited error type. |
803 | #[stable (feature = "try_from" , since = "1.34.0" )] |
804 | impl<T, U> TryFrom<U> for T |
805 | where |
806 | U: Into<T>, |
807 | { |
808 | type Error = Infallible; |
809 | |
810 | #[inline ] |
811 | fn try_from(value: U) -> Result<Self, Self::Error> { |
812 | Ok(U::into(self:value)) |
813 | } |
814 | } |
815 | |
816 | //////////////////////////////////////////////////////////////////////////////// |
817 | // CONCRETE IMPLS |
818 | //////////////////////////////////////////////////////////////////////////////// |
819 | |
820 | #[stable (feature = "rust1" , since = "1.0.0" )] |
821 | impl<T> AsRef<[T]> for [T] { |
822 | #[inline (always)] |
823 | fn as_ref(&self) -> &[T] { |
824 | self |
825 | } |
826 | } |
827 | |
828 | #[stable (feature = "rust1" , since = "1.0.0" )] |
829 | impl<T> AsMut<[T]> for [T] { |
830 | #[inline (always)] |
831 | fn as_mut(&mut self) -> &mut [T] { |
832 | self |
833 | } |
834 | } |
835 | |
836 | #[stable (feature = "rust1" , since = "1.0.0" )] |
837 | impl AsRef<str> for str { |
838 | #[inline (always)] |
839 | fn as_ref(&self) -> &str { |
840 | self |
841 | } |
842 | } |
843 | |
844 | #[stable (feature = "as_mut_str_for_str" , since = "1.51.0" )] |
845 | impl AsMut<str> for str { |
846 | #[inline (always)] |
847 | fn as_mut(&mut self) -> &mut str { |
848 | self |
849 | } |
850 | } |
851 | |
852 | //////////////////////////////////////////////////////////////////////////////// |
853 | // THE NO-ERROR ERROR TYPE |
854 | //////////////////////////////////////////////////////////////////////////////// |
855 | |
856 | /// The error type for errors that can never happen. |
857 | /// |
858 | /// Since this enum has no variant, a value of this type can never actually exist. |
859 | /// This can be useful for generic APIs that use [`Result`] and parameterize the error type, |
860 | /// to indicate that the result is always [`Ok`]. |
861 | /// |
862 | /// For example, the [`TryFrom`] trait (conversion that returns a [`Result`]) |
863 | /// has a blanket implementation for all types where a reverse [`Into`] implementation exists. |
864 | /// |
865 | /// ```ignore (illustrates std code, duplicating the impl in a doctest would be an error) |
866 | /// impl<T, U> TryFrom<U> for T where U: Into<T> { |
867 | /// type Error = Infallible; |
868 | /// |
869 | /// fn try_from(value: U) -> Result<Self, Infallible> { |
870 | /// Ok(U::into(value)) // Never returns `Err` |
871 | /// } |
872 | /// } |
873 | /// ``` |
874 | /// |
875 | /// # Future compatibility |
876 | /// |
877 | /// This enum has the same role as [the `!` “never” type][never], |
878 | /// which is unstable in this version of Rust. |
879 | /// When `!` is stabilized, we plan to make `Infallible` a type alias to it: |
880 | /// |
881 | /// ```ignore (illustrates future std change) |
882 | /// pub type Infallible = !; |
883 | /// ``` |
884 | /// |
885 | /// … and eventually deprecate `Infallible`. |
886 | /// |
887 | /// However there is one case where `!` syntax can be used |
888 | /// before `!` is stabilized as a full-fledged type: in the position of a function’s return type. |
889 | /// Specifically, it is possible to have implementations for two different function pointer types: |
890 | /// |
891 | /// ``` |
892 | /// trait MyTrait {} |
893 | /// impl MyTrait for fn() -> ! {} |
894 | /// impl MyTrait for fn() -> std::convert::Infallible {} |
895 | /// ``` |
896 | /// |
897 | /// With `Infallible` being an enum, this code is valid. |
898 | /// However when `Infallible` becomes an alias for the never type, |
899 | /// the two `impl`s will start to overlap |
900 | /// and therefore will be disallowed by the language’s trait coherence rules. |
901 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
902 | #[derive (Copy)] |
903 | pub enum Infallible {} |
904 | |
905 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
906 | impl Clone for Infallible { |
907 | fn clone(&self) -> Infallible { |
908 | match *self {} |
909 | } |
910 | } |
911 | |
912 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
913 | impl fmt::Debug for Infallible { |
914 | fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result { |
915 | match *self {} |
916 | } |
917 | } |
918 | |
919 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
920 | impl fmt::Display for Infallible { |
921 | fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result { |
922 | match *self {} |
923 | } |
924 | } |
925 | |
926 | #[stable (feature = "str_parse_error2" , since = "1.8.0" )] |
927 | impl Error for Infallible { |
928 | fn description(&self) -> &str { |
929 | match *self {} |
930 | } |
931 | } |
932 | |
933 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
934 | impl PartialEq for Infallible { |
935 | fn eq(&self, _: &Infallible) -> bool { |
936 | match *self {} |
937 | } |
938 | } |
939 | |
940 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
941 | impl Eq for Infallible {} |
942 | |
943 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
944 | impl PartialOrd for Infallible { |
945 | fn partial_cmp(&self, _other: &Self) -> Option<crate::cmp::Ordering> { |
946 | match *self {} |
947 | } |
948 | } |
949 | |
950 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
951 | impl Ord for Infallible { |
952 | fn cmp(&self, _other: &Self) -> crate::cmp::Ordering { |
953 | match *self {} |
954 | } |
955 | } |
956 | |
957 | #[stable (feature = "convert_infallible" , since = "1.34.0" )] |
958 | impl From<!> for Infallible { |
959 | #[inline ] |
960 | fn from(x: !) -> Self { |
961 | x |
962 | } |
963 | } |
964 | |
965 | #[stable (feature = "convert_infallible_hash" , since = "1.44.0" )] |
966 | impl Hash for Infallible { |
967 | fn hash<H: Hasher>(&self, _: &mut H) { |
968 | match *self {} |
969 | } |
970 | } |
971 | |