Attributes
Section |
---|
Attributes |
Lint attributes |
Automatic trait derivation |
Must Use |
Deprecated |
Conditional Compilation |
TODO
Attributes
Attributes can take arguments with different syntaxes:
#[attribute = "value"]
#[attribute(key = "value")]
#[attribute(value)]
#[attribute(value, value2)]
Inner attributes #![attr]
apply to the item that the attribute is declared within.
Lint attributes
During early development, place the following attributes at the top of main.rs
or lib.rs
#![allow(unused_variables)] #![allow(unused_mut)] #![allow(unused_imports)] #![allow(unused_must_use)] // or simply #![allow(unused)] #![allow(dead_code)] #![allow(missing_docs)] use std::thread; pub struct S; #[must_use] fn required() -> u32 { 42 } fn dead_code() {} fn main() { let x = 1; let mut m = 2; }
For production-ready code, replace the above by the following, for example.
//! Crate documentation #![warn( unused, missing_debug_implementations, missing_copy_implementations, missing_docs, rust_2018_idioms )] #![deny(unreachable_pub)] // error if violation #![forbid(unsafe_code)] // same as `deny` +forbids changing the lint level afterwards /// This is the required documentation for S #[derive(Debug, Copy, Clone)] struct S; /// Here is the main test function! fn main() { let _ = S; }
You also apply these attributes to specific functions:
// Disables the `dead_code` lint #[allow(dead_code)] fn unused_function() {} fn main() {}
List of lint checks: rustc -W help
. rustc
⮳ also recognizes the tool lints for "clippy" and "rustdoc" e.g. #![warn(clippy::pedantic)]
Automatic trait derivation
See Automatic derivation.
Must Use
// Must use the results of the fn // Also applies to traits, structs, enums... #[must_use] fn add(a: i32, b: i32) -> i32 { a + b } fn main() { println!("{}", add(1, 2)); }
Deprecated
#![allow(deprecated)] // Removes the warning. #[deprecated(since = "5.2.0", note = "Use bar instead")] pub fn foo() {} fn main() { foo(); }
Conditional Compilation
// This function only gets compiled if the target OS is linux #[cfg(target_os = "linux")] fn are_you_on_linux() { println!("You are running linux!"); } // And this function only gets compiled if the target OS is *not* // linux #[cfg(not(target_os = "linux"))] fn are_you_on_linux() { println!("You are *not* running linux!"); } fn main() { are_you_on_linux(); println!("Are you sure?"); if cfg!(target_os = "linux") { // alternative: use cfg! println!("Yes. It's definitely linux!"); } else { println!("Yes. It's definitely *not* linux!"); } }