From 985e66362f8dc96699e2c621e4a235e8451376d6 Mon Sep 17 00:00:00 2001 From: lcnr/Bastian Kauschke Date: Tue, 19 Nov 2019 10:18:53 +0100 Subject: [PATCH] add fn any::type_name_of_val --- src/libcore/any.rs | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/libcore/any.rs b/src/libcore/any.rs index e2704e807d1..fc6d2c2ee2c 100644 --- a/src/libcore/any.rs +++ b/src/libcore/any.rs @@ -446,7 +446,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!( @@ -459,3 +459,42 @@ impl TypeId { pub const fn type_name() -> &'static str { intrinsics::type_name::() } + +/// Returns the name of the type of the pointed-to value as a string slice. +/// This is the same as `type_name::()`, 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::>(None)` could return the +/// `"Option"` or `"std::option::Option"`, 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(val: &T) -> &'static str { + let _ = val; + type_name::() +}