While I agree with these comments for reading source code, I’m not sure we can meaningfully escape what it’s actually doing when we teach it. I know that I at least thought it was clearest to teach try! as a mechanism for abstracting case analysis, control flow and type conversion simultaneously. I did it this way because it’s a really clear progression from doing any one of those things manually (i.e., writing out the match, adding an explicit return or doing an explicit type conversion). If you’re going to be using Result, ?, From and Error in your code, then you really need to know how they all work together, and I don’t think we can gloss over it.
With that said, I don’t really think implicit returns are a problem. They seem to be fine in the try! macro.
I will say that I don’t really understand how ? is a huge improvement over try! (nor do I see how it is a huge loss, either), but lots of folks do insist that it simplifies error handling. If I think about it in terms of how much it shrinks the Error Handling chapter in the book though, I don’t think there’s much difference. Error handling is still a complex (and wonderful, especially in Rust, IMO) topic, with or without ?. That is, I personally think both sides of this debate are enormously overstated.
Either way, I think the community reached a consensus that we should adopt ? and we should now move forward and start debating the Carrier trait. Rehashing the RFC really won’t do us much good unless there’s some compelling new evidence (like, for example, lots of people tried it and hated it, but I’m not seeing that).