core/convert/
mod.rs

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

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy