The problem you have presented is the result of the fact, that Rust is (primarily) an expression based language. As the Rust reference states:
Rust is primarily an expression language. This means that most forms of value-producing or effect-causing evaluation are directed by the uniform syntax category of expressions. Each kind of expression can typically nest within each other kind of expression, and rules for evaluation of expressions involve specifying both the value produced by the expression and the order in which its sub-expressions are themselves evaluated.
In contrast, statements serve mostly to contain and explicitly sequence expression evaluation.
Because of that most things that in other languages would be statements in rust are expressions instead (like for example if-else blocks).
Another, this time rather unwritten rule, is that Rust is explicit. As cdhowie pointed out in comments this is a very good thing. In the example you have presented the compiler can guess that you wanted to return early, and this will most often than not a correct guess. However even in this easy example this guess is not guaranteed to be always correct. And in some more complex example compiler conservatively assumes that it cannot be sure what the user wants.
The third argument, which is kind of an extension of the previous one, is that early return (as well as break and continue) break normal control flow of the function/loop. Therefore we must explicitly mark it as such. Otherwise it could lead to confusion about the control flow of the function.
To summarize, Rust requires early returns to be explicitly marked to:
- be consistent with the rules about expressions
- be conservative and do not risking guessing wrong
- be explicit about breaking the flow of the function, which helps reader to reason about the code.