diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-11-23 02:22:44 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-23 02:22:44 +0100 |
| commit | 0ae4a19cf3f0f8a9b1e5ea9e9307d6968eabf71e (patch) | |
| tree | 56c0560043e512a4f37fb304ff8d99dc27f15afd /src/libcore | |
| parent | a449535bbc7912c4adc1bbf2ab2738d0442f212c (diff) | |
| parent | 985e66362f8dc96699e2c621e4a235e8451376d6 (diff) | |
| download | rust-0ae4a19cf3f0f8a9b1e5ea9e9307d6968eabf71e.tar.gz rust-0ae4a19cf3f0f8a9b1e5ea9e9307d6968eabf71e.zip | |
Rollup merge of #65961 - lcnr:typename_of, r=Dylan-DPC
add fn type_name_of_val
This function is often useful during testing and mirrors `align_of_val` and `size_of_val`.
# Example
Showing the default type of integers.
```rust
let x = 7;
println!("per default, integers have the type: {}", std::any::type_name_of_val(&x));
```
To my knowledge this can currently not be done without defining a function similar to `type_name_of_val`.
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/any.rs | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/libcore/any.rs b/src/libcore/any.rs index 39a5dd7263c..57a2aecd8be 100644 --- a/src/libcore/any.rs +++ b/src/libcore/any.rs @@ -452,7 +452,7 @@ impl TypeId { /// The current implementation uses the same infrastructure as compiler /// diagnostics and debuginfo, but this is not guaranteed. /// -/// # Example +/// # Examples /// /// ```rust /// assert_eq!( @@ -465,3 +465,42 @@ impl TypeId { pub const fn type_name<T: ?Sized>() -> &'static str { intrinsics::type_name::<T>() } + +/// Returns the name of the type of the pointed-to value as a string slice. +/// This is the same as `type_name::<T>()`, but can be used where the type of a +/// variable is not easily available. +/// +/// # Note +/// +/// This is intended for diagnostic use. The exact contents and format of the +/// string are not specified, other than being a best-effort description of the +/// type. For example, `type_name_of::<Option<String>>(None)` could return the +/// `"Option<String>"` or `"std::option::Option<std::string::String>"`, but not +/// `"foobar"`. In addition, the output may change between versions of the +/// compiler. +/// +/// The type name should not be considered a unique identifier of a type; +/// multiple types may share the same type name. +/// +/// The current implementation uses the same infrastructure as compiler +/// diagnostics and debuginfo, but this is not guaranteed. +/// +/// # Examples +/// +/// Prints the default integer and float types. +/// +/// ```rust +/// #![feature(type_name_of_val)] +/// use std::any::type_name_of_val; +/// +/// let x = 1; +/// println!("{}", type_name_of_val(&x)); +/// let y = 1.0; +/// println!("{}", type_name_of_val(&y)); +/// ``` +#[unstable(feature = "type_name_of_val", issue = "66359")] +#[rustc_const_unstable(feature = "const_type_name")] +pub const fn type_name_of_val<T: ?Sized>(val: &T) -> &'static str { + let _ = val; + type_name::<T>() +} |
