(that's what seems to be in the second example). In other words, you can treat the match block as some value. So, let's replace it with something simpler, so that the match syntax won't distract us: let's speak about literal 0.
The first case will then be let guess: u32 = 0; The second one is just 0.
The formal difference is that let begins a statement of the form let *var*: *type* = *expression*; and the semicolon is a part of this statement syntax (or, more generally, of any statement syntax, AFAIK). The second case, contrary to this, is just a bare expression, without any enclosing statement; and the expression doesn't need any punctuation around it.