To be clear, Rust does not have "implicit returns" nor does it use semicolons to indicate return values.
Expressions evaluate to a value, and semicolons take an expression, throw away its value, and evaluate to () instead. That's it.
The other behaviors you're talking about fall out of these semantics, but are also different than what you've said; functions evaluate to a value, so the final expression's value determines the value it evaluates to, but you cannot "implicitly return" from the middle of a function by dropping a ;, for example.
It's a bit of a semantic distinction isn't it? In practice what it means is that you add semicolons to the end of almost every line of imperative code in a block, and you leave the semicolon off the last line and this becomes your return value implicitly (without the use of a return keyword).
Expressions evaluate to a value, and semicolons take an expression, throw away its value, and evaluate to () instead. That's it.
The other behaviors you're talking about fall out of these semantics, but are also different than what you've said; functions evaluate to a value, so the final expression's value determines the value it evaluates to, but you cannot "implicitly return" from the middle of a function by dropping a ;, for example.