|
13 | 13 | //! This module implements the `Any` trait, which enables dynamic typing
|
14 | 14 | //! of any `'static` type through runtime reflection.
|
15 | 15 | //!
|
16 |
| -//! `Any` itself can be used to get a `TypeId`, and has more features when used as a trait object. |
17 |
| -//! As `&Any` (a borrowed trait object), it has the `is` and `as_ref` methods, to test if the |
18 |
| -//! contained value is of a given type, and to get a reference to the inner value as a type. As |
19 |
| -//! `&mut Any`, there is also the `as_mut` method, for getting a mutable reference to the inner |
20 |
| -//! value. `Box<Any>` adds the `move` method, which will unwrap a `Box<T>` from the object. See |
21 |
| -//! the extension traits (`*Ext`) for the full details. |
| 16 | +//! `Any` itself can be used to get a `TypeId`, and has more features when used |
| 17 | +//! as a trait object. As `&Any` (a borrowed trait object), it has the `is` and |
| 18 | +//! `as_ref` methods, to test if the contained value is of a given type, and to |
| 19 | +//! get a reference to the inner value as a type. As`&mut Any`, there is also |
| 20 | +//! the `as_mut` method, for getting a mutable reference to the inner value. |
| 21 | +//! `Box<Any>` adds the `move` method, which will unwrap a `Box<T>` from the |
| 22 | +//! object. See the extension traits (`*Ext`) for the full details. |
| 23 | +//! |
| 24 | +//! Note that &Any is limited to testing whether a value is of a specified |
| 25 | +//! concrete type, and cannot be used to test whether a type implements a trait. |
| 26 | +//! |
| 27 | +//! # Examples |
| 28 | +//! |
| 29 | +//! Consider a situation where we want to log out a value passed to a function. |
| 30 | +//! We know the value we're working on implements Show, but we don't know its |
| 31 | +//! concrete type. We want to give special treatment to certain types: in this |
| 32 | +//! case printing out the length of String values prior to their value. |
| 33 | +//! We don't know the concrete type of our value at compile time, so we need to |
| 34 | +//! use runtime reflection instead. |
| 35 | +//! |
| 36 | +//! ```rust |
| 37 | +//! use std::fmt::Show; |
| 38 | +//! use std::any::{Any, AnyRefExt}; |
| 39 | +//! |
| 40 | +//! // Logger function for any type that implements Show. |
| 41 | +//! fn log<T: Any+Show>(value: &T) { |
| 42 | +//! let value_any = value as &Any; |
| 43 | +//! |
| 44 | +//! // try to convert our value to a String. If successful, we want to |
| 45 | +//! // output the String's length as well as its value. If not, it's a |
| 46 | +//! // different type: just print it out unadorned. |
| 47 | +//! match value_any.as_ref::<String>() { |
| 48 | +//! Some(as_string) => { |
| 49 | +//! println!("String ({}): {}", as_string.len(), as_string); |
| 50 | +//! } |
| 51 | +//! None => { |
| 52 | +//! println!("{}", value); |
| 53 | +//! } |
| 54 | +//! } |
| 55 | +//! } |
| 56 | +//! |
| 57 | +//! // This function wants to log its parameter out prior to doing work with it. |
| 58 | +//! fn do_work<T: Show>(value: &T) { |
| 59 | +//! log(value); |
| 60 | +//! // ...do some other work |
| 61 | +//! } |
| 62 | +//! |
| 63 | +//! fn main() { |
| 64 | +//! let my_string = "Hello World".to_string(); |
| 65 | +//! do_work(&my_string); |
| 66 | +//! |
| 67 | +//! let my_i8: i8 = 100; |
| 68 | +//! do_work(&my_i8); |
| 69 | +//! } |
| 70 | +//! ``` |
22 | 71 |
|
23 | 72 | use mem::{transmute, transmute_copy};
|
24 | 73 | use option::{Option, Some, None};
|
|
0 commit comments