 <p>Rust has local type inference, so the type normally doesn’t need to be written; <code>let x = 5;</code> will suffice. <code>x = 5;</code> would be quite different, as it would not <em>declare</em> a variable <code>x</code>, and Rust very deliberately separates declaration and assignment.</p> <p>It’s also actually <code>let PATTERN = EXPR;</code>, not just <code>let IDENT = EXPR;</code>, so removing the <code>let</code> keyword would cause grammatical ambiguity. A pattern could be <code>mut x</code> (making the variable binding mutable), it could be <code>(a, b)</code> signifying tuple unpacking, <em>&amp;c.</em></p> <p>You only think <code>i32 x = 5;</code> makes sense because you’re used to languages like C++. Seriously, who came up with that idea? It makes more sense on purely philosophical grounds to have the type after the name than before, and having just the type to declare variables is silly too. All sorts of grammatical ambiguity there. Type inference, allowing you to omit the type altogether, is a much nicer approach all round.</p>