Indeed. The ? operator in Rust indicates the handful of places that can produce implicit returns by making those returns explicit in the language and manually propagated.
For example, if you look at the spec for JavaScript, most operations produce a completion (which can either be a “normal” completion or a “throw” completion).
The spec has a macro called ReturnIfAbrupt:
Algorithms steps that say
1. ReturnIfAbrupt(argument).
mean the same thing as:
1. If argument is an abrupt completion, return argument.
2. Else if argument is a Completion Record, let argument be argument.[[value]].
Recent versions of the JavaScript spec have added a ? prefix operator:
Abstract operations referenced using the functional application style
and the method application style that are prefixed by `?` indicate that
ReturnIfAbrupt should be applied to the resulting Completion Record.
Yes, Completion Record is basically Result, and ReturnIfAbrupt is basically try!.
In other words, virtually all operations in JavaScript produce Result, and the language semantics add ? to every expression to propagate errors. In Rust, since many fewer expressions can produce errors, the explicitness makes it easy to handle errors robustly.