Declarations can be annotated with ‘attributes’ in Rust. They look like this:
# #![allow(unused_variables)]
#fn main() {
#[test]
# fn foo() {}
#} or like this:
# #![allow(unused_variables)]
#fn main() {
# mod foo {
#![test]
# }
#} The difference between the two is the !, which changes what the attribute applies to:
#[foo]
struct Foo;
mod bar {
#![bar]
}
The #[foo] attribute applies to the next item, which is the struct declaration. The #![bar] attribute applies to the item enclosing it, which is the mod declaration. Otherwise, they’re the same. Both change the meaning of the item they’re attached to somehow.
For example, consider a function like this:
# #![allow(unused_variables)]
#fn main() {
#[test]
fn check() {
assert_eq!(2, 1 + 1);
}
#} It is marked with #[test]. This means it’s special: when you run tests, this function will execute. When you compile as usual, it won’t even be included. This function is now a test function.
Attributes may also have additional data:
# #![allow(unused_variables)]
#fn main() {
#[inline(always)]
fn super_fast_fn() {
# }
#} Or even keys and values:
# #![allow(unused_variables)]
#fn main() {
#[cfg(target_os = "macos")]
mod macos_only {
# }
#} Rust attributes are used for a number of different things. There is a full list of attributes in the reference. Currently, you are not allowed to create your own attributes, the Rust compiler defines them.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/book/first-edition/attributes.html