Yes, I suppose they do. The only counter-argument I can think of is that I only rarely have issues due to type inference or deref coercions, and when I do they’re usually pretty easy to resolve.
To give a comparative example: I was around before deref chaining was added. I was slightly nervous about that too, but after it was added I didn’t notice any real issues caused by it. It fit fairly well into a mental model of “I want to borrow the contents of this thing”, even if the path from what I had to what I was using wasn’t immediately apparent.
Since the match thing happened, though, it’s already tripped me up three times thus far, and that’s while I’m still trying to write explicit code. I feel like the compiler doesn’t have my back any more, and it’s making me a lot less sure that any given pattern match I write is doing what I think it’s doing. There’s no consistent visual trigger here: any pattern match could be doing something other than what it looks like.
In the case of type inference, I can avoid it by just explicitly filling in all the type holes in my code. The only way I can be sure that a pattern match is doing what I think it’s doing is to go out of my way to try and break it.
Right, but when you make a mistake, you have to fix it. That’s where having a mental model that is highly consistent with the compiler helps enormously.
Incidentally, Rust does not prevent all problems, so too much trust in your tools is a bad idea. For example, I actually had a really nasty concurrency bug in my code recently because I trusted Rust too much. It’s not that there was a bug in the compiler or hole in the language, it’s just that I made a mistake in an area where the language couldn’t protect me because I took “fearless concurrency” too much to heart.
As an aside, I don’t find arguments about being able to turn this off (via whatever mechanism) causing fragmentation to be very compelling. After all, Rust without auto-ref in pattern matching is just a more explicit form of Rust. Anyone who understands one will understand the other; it’s like saying the ability to explicitly write types inside function bodies causes fragmentary dialects because some will write types and some won’t.
Actually, I think having explicitness lints in general might be a good idea. That might free up the core team to add more of the convenience features newcomers to the language want, while ameliorating the concerns of those who love Rust because it’s more explicit than a lot of other contemporary languages.
Either way, this specific convenience is one I will definitely be excising from my serious code as soon as I can.