|
1 | 1 | #[doc(keyword = "as")] |
2 | 2 | // |
3 | | -/// Cast between types, or rename an import. |
| 3 | +/// The `as` keyword is used in many syntactic locations: |
| 4 | +/// * `as` is used to cast between types. |
| 5 | +/// * `as` is used to rename an import in `use` and `extern crate` statements. |
| 6 | +/// * `as` is also used to disambiguate trait implementations. |
4 | 7 | /// |
5 | | -/// `as` is most commonly used to turn primitive types into other primitive types, but it has other |
| 8 | +/// In the type-casting sense, `as` is most commonly used to turn primitive types into other primitive types, but it has other |
6 | 9 | /// uses that include turning pointers into addresses, addresses into pointers, and pointers into |
7 | 10 | /// other pointers. |
8 | 11 | /// |
|
14 | 17 | /// assert_eq!(true as u8 + thing2 as u8, 100); |
15 | 18 | /// ``` |
16 | 19 | /// |
17 | | -/// In general, any cast that can be performed via ascribing the type can also be done using `as`, |
| 20 | +/// In general, any type-cast that can be performed via ascribing the type can also be done using `as`, |
18 | 21 | /// so instead of writing `let x: u32 = 123`, you can write `let x = 123 as u32` (note: `let x: u32 |
19 | 22 | /// = 123` would be best in that situation). The same is not true in the other direction, however; |
20 | 23 | /// explicitly using `as` allows a few more coercions that aren't allowed implicitly, such as |
|
37 | 40 | /// use std::{mem as memory, net as network}; |
38 | 41 | /// // Now you can use the names `memory` and `network` to refer to `std::mem` and `std::net`. |
39 | 42 | /// ``` |
40 | | -/// For more information on what `as` is capable of, see the [Reference]. |
41 | 43 | /// |
42 | | -/// [Reference]: ../reference/expressions/operator-expr.html#type-cast-expressions |
| 44 | +/// `as` is also used to [disambiguate call expressions][Disambiguation Call Expressions]: |
| 45 | +/// |
| 46 | +/// ```rust |
| 47 | +/// struct S; |
| 48 | +/// impl S { |
| 49 | +/// fn f() { println!("S"); } |
| 50 | +/// } |
| 51 | +/// trait T1 { |
| 52 | +/// fn f() { println!("T1 f"); } |
| 53 | +/// } |
| 54 | +/// impl T1 for S {} |
| 55 | +/// trait T2 { |
| 56 | +/// fn f() { println!("T2 f"); } |
| 57 | +/// } |
| 58 | +/// impl T2 for S {} |
| 59 | +/// S::f(); // Calls the inherent impl. |
| 60 | +/// <S as T1>::f(); // Calls the T1 trait function. |
| 61 | +/// <S as T2>::f(); // Calls the T2 trait function. |
| 62 | +/// |
| 63 | +/// ``` |
| 64 | +/// |
| 65 | +/// More information for `as` is available at the references for [Type Casting], [Call Expressions][Disambiguation Call Expressions], [Qualified Paths][Disambiguation Qualified Paths]. |
| 66 | +/// |
| 67 | +/// See also: [`use`], [`crate`]. |
| 68 | +/// |
| 69 | +/// [Type Casting]: ../reference/expressions/operator-expr.html#type-cast-expressions |
| 70 | +/// [Disambiguation Qualified Paths]: ../reference/paths.html#r-paths.qualified.intro |
| 71 | +/// [Disambiguation Call Expressions]: ../reference/expressions/call-expr.html#disambiguating-function-calls |
43 | 72 | /// [`crate`]: keyword.crate.html |
44 | 73 | /// [`use`]: keyword.use.html |
45 | 74 | /// [const-cast]: pointer::cast |
|
0 commit comments