Use `let` to declare a local variable binding. A binding is immutable by default: `let a = 10;` gives `a` a value without making the binding read-write. The semicolon ends the statement. section 2.2.1
Listing 2.2 Adding integers using variables and declaring types
fn main() { #1
let a = 10; #2
let b: i32 = 20; #3
let c = 30i32; #4
let d = 30_i32; #5
let e = add(add(a, b), add(c, d));
println!("( a + b ) + ( c + d ) = {}", e);
}
fn add(i: i32, j: i32) -> i32 { #6
i + j #7
}
The integer-addition program shows inferred types (`let a = 10;`), an explicit type (`let b: i32 = 20;`), and types attached to numeric literals. section 2.2.1
An immutable binding does not mean every part of its value must remain unchanged. Some types, including `Arc` and `Rc`, can update an internal reference count while presenting an immutable interface. This is called interior mutability and helps explain why `let` and `const` are distinct. section 3.4.1
Borrowing adds another distinction: multiple read-only references may point to the same data, while mutable borrows are guaranteed not to alias it. section 3.4.1

