W3cubDocs

/Rust

Block expressions

Syntax
BlockExpression :
{
InnerAttribute*
Statement*
Expression?
}

A block expression is similar to a module in terms of the declarations that are possible, but can also contain statements and end with an expression. Each block conceptually introduces a new namespace scope. Use items can bring new names into scopes and declared items are in scope for only the block itself.

A block will execute each statement sequentially, and then execute the expression (if given). If the block doesn't end in an expression, its value is ():

# #![allow(unused_variables)]
#fn main() {
let x: () = { println!("Hello."); };
#}

If it ends in an expression, its value and type are that of the expression:

# #![allow(unused_variables)]
#fn main() {
let x: i32 = { println!("Hello."); 5 };

assert_eq!(5, x);
#}

Blocks are always rvalues and evaluate the last expression in rvalue context. This can be used to force moving a value if really needed.

unsafe blocks

Syntax
UnsafeBlockExpression :
unsafe BlockExpression

See unsafe block for more information on when to use unsafe

A block of code can be prefixed with the unsafe keyword, to permit calling unsafe functions or dereferencing raw pointers within a safe function. Examples:

# #![allow(unused_variables)]
#fn main() {
unsafe {
    let b = [13u8, 17u8];
    let a = &b[0] as *const u8;
    assert_eq!(*a, 13);
    assert_eq!(*a.offset(1), 17);
}

# unsafe fn f() -> i32 { 10 }
let a = unsafe { f() };
#}

© 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/reference/expressions/block-expr.html