]> git.lizzy.rs Git - rust.git/blob - src/libcore/ops/deref.rs
Clear out std, not std tools
[rust.git] / src / libcore / ops / deref.rs
1 /// Used for immutable dereferencing operations, like `*v`.
2 ///
3 /// In addition to being used for explicit dereferencing operations with the
4 /// (unary) `*` operator in immutable contexts, `Deref` is also used implicitly
5 /// by the compiler in many circumstances. This mechanism is called
6 /// ['`Deref` coercion'][more]. In mutable contexts, [`DerefMut`] is used.
7 ///
8 /// Implementing `Deref` for smart pointers makes accessing the data behind them
9 /// convenient, which is why they implement `Deref`. On the other hand, the
10 /// rules regarding `Deref` and [`DerefMut`] were designed specifically to
11 /// accommodate smart pointers. Because of this, **`Deref` should only be
12 /// implemented for smart pointers** to avoid confusion.
13 ///
14 /// For similar reasons, **this trait should never fail**. Failure during
15 /// dereferencing can be extremely confusing when `Deref` is invoked implicitly.
16 ///
17 /// # More on `Deref` coercion
18 ///
19 /// If `T` implements `Deref<Target = U>`, and `x` is a value of type `T`, then:
20 ///
21 /// * In immutable contexts, `*x` on non-pointer types is equivalent to
22 ///   `*Deref::deref(&x)`.
23 /// * Values of type `&T` are coerced to values of type `&U`
24 /// * `T` implicitly implements all the (immutable) methods of the type `U`.
25 ///
26 /// For more details, visit [the chapter in *The Rust Programming Language*][book]
27 /// as well as the reference sections on [the dereference operator][ref-deref-op],
28 /// [method resolution] and [type coercions].
29 ///
30 /// [book]: ../../book/ch15-02-deref.html
31 /// [`DerefMut`]: trait.DerefMut.html
32 /// [more]: #more-on-deref-coercion
33 /// [ref-deref-op]: ../../reference/expressions/operator-expr.html#the-dereference-operator
34 /// [method resolution]: ../../reference/expressions/method-call-expr.html
35 /// [type coercions]: ../../reference/type-coercions.html
36 ///
37 /// # Examples
38 ///
39 /// A struct with a single field which is accessible by dereferencing the
40 /// struct.
41 ///
42 /// ```
43 /// use std::ops::Deref;
44 ///
45 /// struct DerefExample<T> {
46 ///     value: T
47 /// }
48 ///
49 /// impl<T> Deref for DerefExample<T> {
50 ///     type Target = T;
51 ///
52 ///     fn deref(&self) -> &Self::Target {
53 ///         &self.value
54 ///     }
55 /// }
56 ///
57 /// let x = DerefExample { value: 'a' };
58 /// assert_eq!('a', *x);
59 /// ```
60 #[lang = "deref"]
61 #[doc(alias = "*")]
62 #[doc(alias = "&*")]
63 #[stable(feature = "rust1", since = "1.0.0")]
64 pub trait Deref {
65     /// The resulting type after dereferencing.
66     #[stable(feature = "rust1", since = "1.0.0")]
67     type Target: ?Sized;
68
69     /// Dereferences the value.
70     #[must_use]
71     #[stable(feature = "rust1", since = "1.0.0")]
72     fn deref(&self) -> &Self::Target;
73 }
74
75 #[stable(feature = "rust1", since = "1.0.0")]
76 impl<T: ?Sized> Deref for &T {
77     type Target = T;
78
79     fn deref(&self) -> &T {
80         *self
81     }
82 }
83
84 #[stable(feature = "rust1", since = "1.0.0")]
85 impl<T: ?Sized> Deref for &mut T {
86     type Target = T;
87
88     fn deref(&self) -> &T {
89         *self
90     }
91 }
92
93 /// Used for mutable dereferencing operations, like in `*v = 1;`.
94 ///
95 /// In addition to being used for explicit dereferencing operations with the
96 /// (unary) `*` operator in mutable contexts, `DerefMut` is also used implicitly
97 /// by the compiler in many circumstances. This mechanism is called
98 /// ['`Deref` coercion'][more]. In immutable contexts, [`Deref`] is used.
99 ///
100 /// Implementing `DerefMut` for smart pointers makes mutating the data behind
101 /// them convenient, which is why they implement `DerefMut`. On the other hand,
102 /// the rules regarding [`Deref`] and `DerefMut` were designed specifically to
103 /// accommodate smart pointers. Because of this, **`DerefMut` should only be
104 /// implemented for smart pointers** to avoid confusion.
105 ///
106 /// For similar reasons, **this trait should never fail**. Failure during
107 /// dereferencing can be extremely confusing when `DerefMut` is invoked
108 /// implicitly.
109 ///
110 /// # More on `Deref` coercion
111 ///
112 /// If `T` implements `DerefMut<Target = U>`, and `x` is a value of type `T`,
113 /// then:
114 ///
115 /// * In mutable contexts, `*x` on non-pointer types is equivalent to
116 ///   `*DerefMut::deref_mut(&mut x)`.
117 /// * Values of type `&mut T` are coerced to values of type `&mut U`
118 /// * `T` implicitly implements all the (mutable) methods of the type `U`.
119 ///
120 /// For more details, visit [the chapter in *The Rust Programming Language*][book]
121 /// as well as the reference sections on [the dereference operator][ref-deref-op],
122 /// [method resolution] and [type coercions].
123 ///
124 /// [book]: ../../book/ch15-02-deref.html
125 /// [`Deref`]: trait.Deref.html
126 /// [more]: #more-on-deref-coercion
127 /// [ref-deref-op]: ../../reference/expressions/operator-expr.html#the-dereference-operator
128 /// [method resolution]: ../../reference/expressions/method-call-expr.html
129 /// [type coercions]: ../../reference/type-coercions.html
130 ///
131 /// # Examples
132 ///
133 /// A struct with a single field which is modifiable by dereferencing the
134 /// struct.
135 ///
136 /// ```
137 /// use std::ops::{Deref, DerefMut};
138 ///
139 /// struct DerefMutExample<T> {
140 ///     value: T
141 /// }
142 ///
143 /// impl<T> Deref for DerefMutExample<T> {
144 ///     type Target = T;
145 ///
146 ///     fn deref(&self) -> &Self::Target {
147 ///         &self.value
148 ///     }
149 /// }
150 ///
151 /// impl<T> DerefMut for DerefMutExample<T> {
152 ///     fn deref_mut(&mut self) -> &mut Self::Target {
153 ///         &mut self.value
154 ///     }
155 /// }
156 ///
157 /// let mut x = DerefMutExample { value: 'a' };
158 /// *x = 'b';
159 /// assert_eq!('b', *x);
160 /// ```
161 #[lang = "deref_mut"]
162 #[doc(alias = "*")]
163 #[stable(feature = "rust1", since = "1.0.0")]
164 pub trait DerefMut: Deref {
165     /// Mutably dereferences the value.
166     #[stable(feature = "rust1", since = "1.0.0")]
167     fn deref_mut(&mut self) -> &mut Self::Target;
168 }
169
170 #[stable(feature = "rust1", since = "1.0.0")]
171 impl<T: ?Sized> DerefMut for &mut T {
172     fn deref_mut(&mut self) -> &mut T {
173         *self
174     }
175 }
176
177 /// Indicates that a struct can be used as a method receiver, without the
178 /// `arbitrary_self_types` feature. This is implemented by stdlib pointer types like `Box<T>`,
179 /// `Rc<T>`, `&T`, and `Pin<P>`.
180 #[lang = "receiver"]
181 #[unstable(feature = "receiver_trait", issue = "none")]
182 #[doc(hidden)]
183 pub trait Receiver {
184     // Empty.
185 }
186
187 #[unstable(feature = "receiver_trait", issue = "none")]
188 impl<T: ?Sized> Receiver for &T {}
189
190 #[unstable(feature = "receiver_trait", issue = "none")]
191 impl<T: ?Sized> Receiver for &mut T {}