Atributos

Las declaraciones pueden ser anotadas con ‘atributos’ en Rust. Los atributos lucen así:

fn main() { #[test] fn foo() {} }
#[test]

o de esta manera:

fn main() { mod foo { #![test] } }
#![test]

La diferencia entre los dos es el !, que cambia a que cosa aplica el atributo:

fn main() { #[foo] struct Foo; mod bar { #![bar] } }
#[foo]
struct Foo;

mod bar {
    #![bar]
}

El atributo #[foo] aplica a el siguiente item, que es la declaración del struct. El atributo #![bar] aplica a el item que lo encierra, la declaración mod. De resto, son lo mismo. Ambos cambian de alguna forma el significado de el item al cual están asociados.

Por ejemplo, considera una función como esta:

fn main() { #[test] fn comprobar() { assert_eq!(2, 1 + 1); } }
#[test]
fn comprobar() {
    assert_eq!(2, 1 + 1);
}

Esta marcado con #[test]. Esto significa que es especial: cuando ejecutes las pruebas, esta función sera ejecutada. Cuando compilas normalmente, no sera incluida ni siquiera. La función es ahora una función de prueba.

Los atributos pueden tener también data adicional:

fn main() { #[inline(always)] fn fn_super_rapida() { } }
#[inline(always)]
fn fn_super_rapida() {

O incluso claves y valores:

fn main() { #[cfg(target_os = "macos")] mod solo_macos { } }
#[cfg(target_os = "macos")]
mod solo_macos {

Los atributos son usados para un numero de cosas diferentes en Rust. Hay una lista de atributos completa en la referencia. Actualmente, no tienes permitido crear tus propios atributos, el compilador de Rust los define.