mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-13 04:26:48 +00:00
Rollup merge of #118234 - tgross35:type_name_of_value, r=dtolnay
Stabilize `type_name_of_val` Make the following API stable: ```rust // in core::any pub fn type_name_of_val<T: ?Sized>(_val: &T) -> &'static str ``` This is a convenience method to get the type name of a value, as opposed to `type_name` that takes a type as a generic. Const stability is not added because this relies on `type_name` which is also not const. That has a blocking issue https://github.com/rust-lang/rust/issues/97156. Wording was also changed to direct most of the details to `type_name` so we don't have as much duplicated documentation. Fixes tracking issue #66359. There were two main concerns in the tracking issue: 1. Naming: `type_name_of` and `type_name_of_val` seem like the only mentioned options. Differences in opinion here come from `std::mem::{size_of, align_of, size_of_val, align_of_val}`. This PR leaves the name as `type_name_of_val`, but I can change if desired since it is pretty verbose. 2. What this displays for `&dyn`: I don't think that having `type_name_of_val` function resolve those is worth the headache it would be, see https://github.com/rust-lang/rust/issues/66359#issuecomment-1718480774 for some workarounds. I also amended the docs wording to leave it open-ended, in case we have means to change that behavior in the future. ``@rustbot`` label -T-libs +T-libs-api +needs-fcp r? libs-api
This commit is contained in:
commit
ea6daca3cb
@ -695,44 +695,41 @@ 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.
|
||||
/// Returns the type name 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_val::<Option<String>>(None)` could return
|
||||
/// `"Option<String>"` or `"std::option::Option<std::string::String>"`, but not
|
||||
/// `"foobar"`. In addition, the output may change between versions of the
|
||||
/// compiler.
|
||||
/// Like [`type_name`], this is intended for diagnostic use and the exact output is not
|
||||
/// guaranteed. It provides a best-effort description, but the output may change between
|
||||
/// versions of the compiler.
|
||||
///
|
||||
/// This function does not resolve trait objects,
|
||||
/// meaning that `type_name_of_val(&7u32 as &dyn Debug)`
|
||||
/// may return `"dyn Debug"`, but not `"u32"`.
|
||||
/// In short: use this for debugging, avoid using the output to affect program behavior. More
|
||||
/// information is available at [`type_name`].
|
||||
///
|
||||
/// 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.
|
||||
/// Additionally, this function does not resolve trait objects. This means that
|
||||
/// `type_name_of_val(&7u32 as &dyn Debug)` may return `"dyn Debug"`, but will not return `"u32"`
|
||||
/// at this time.
|
||||
///
|
||||
/// # 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));
|
||||
/// let s = "foo";
|
||||
/// let x: i32 = 1;
|
||||
/// let y: f32 = 1.0;
|
||||
///
|
||||
/// assert!(type_name_of_val(&s).contains("str"));
|
||||
/// assert!(type_name_of_val(&x).contains("i32"));
|
||||
/// assert!(type_name_of_val(&y).contains("f32"));
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[unstable(feature = "type_name_of_val", issue = "66359")]
|
||||
#[stable(feature = "type_name_of_val", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_const_unstable(feature = "const_type_name", issue = "63084")]
|
||||
pub const fn type_name_of_val<T: ?Sized>(_val: &T) -> &'static str {
|
||||
type_name::<T>()
|
||||
|
@ -6,7 +6,6 @@
|
||||
// check-pass
|
||||
// aux-build:use_by_macro.rs
|
||||
|
||||
#![feature(type_name_of_val)]
|
||||
extern crate use_by_macro;
|
||||
|
||||
use use_by_macro::*;
|
||||
|
Loading…
Reference in New Issue
Block a user