about summary refs log tree commit diff
path: root/src/libcore/any.rs
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-11-23 02:22:44 +0100
committerGitHub <noreply@github.com>2019-11-23 02:22:44 +0100
commit0ae4a19cf3f0f8a9b1e5ea9e9307d6968eabf71e (patch)
tree56c0560043e512a4f37fb304ff8d99dc27f15afd /src/libcore/any.rs
parenta449535bbc7912c4adc1bbf2ab2738d0442f212c (diff)
parent985e66362f8dc96699e2c621e4a235e8451376d6 (diff)
downloadrust-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/any.rs')
-rw-r--r--src/libcore/any.rs41
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>()
+}