Crate Version Build Status MIT License
The name_of!() macro defined in this crate takes a binding, type, const, or function as an argument and returns its unqualified string representation. If the identifier does not exist in the current context, the macro will cause a compilation error. This macro is mainly intended for debugging purposes and to improve the refactoring experience compared to stringify!().
Add nameof as a dependency to your project's Cargo.toml file:
[dependencies] nameof = "1.3.0"
To use the macro(s), import the crate with the required annotation:
use nameof::name_of; fn main() { let text = "Hello, World!"; println!("Binding `{}` holds `{}`.", name_of!(text), text); }
The name_of!() macro is used as follows:
use nameof::name_of; struct TestStruct { test_field: i32, } impl TestStruct { const TEST_CONST: i32 = 1; } struct GenericStruct<T> { test_field_t: T, } fn greet() -> &'static str { "Hi, World" } fn main() { let text = "Hello, World!"; println!("Binding `{}` holds `{}`.", name_of!(text), text); println!("Function `{}` says `{}`.", name_of!(greet), greet()); println!( "Struct `{}` has a field `{}`.", name_of!(type TestStruct), name_of!(test_field in TestStruct) ); println!( "Generic Struct `{}` has a field `{}`.", name_of!(type GenericStruct<String>), name_of!(test_field_t in GenericStruct<String>) ); println!( "Struct `{}` has an associated constant `{}`.", name_of!(type TestStruct), name_of!(const TEST_CONST in TestStruct) ); println!( "Standard types such as `{}` and `{}` also work.", name_of!(type i32), name_of!(type f64) ); }
Alternatively, name_of_type!(T) can be used instead of name_of!(type T).
use nameof::name_of_type; struct TestStruct { test_field: i32, } fn main() { println!("Struct is called `{}`.", name_of_type!(TestStruct)); println!("Type is called `{}`.", name_of_type!(i32)); }
See LICENSE.txt.