Are you talking about the borrow checker from half a decade ago? [0] Have you used the language since then? This is FUD -- it's really not hard to get code past the borrow checker anymore. Maybe every thousand lines or so you'll need to add a block or pull a temporary variable out of a one-liner, but the compiler basically tells you exactly what to do when something like that is relevant.
[0] https://pcwalton.github.io/blog/2013/01/21/the-new-borrow-ch...
I guess a confirmation that there were problems there is that they tried to improve the borrow checker in the releases after that.
(You can also often get away with Cell rather than RefCell.)
How come, when you have a struct method, accessing field members only visible to that specific method.
Something that is very easy to do with moving in lambda contexts in C++.
You can alternatively move the struct or its fields into the closure, but then you lose the first path. I know you're not doing that because if you were you wouldn't be having lifetime problems (and you wouldn't be able to share the state across event handlers, so it's not a great solution anyway).
It is related to closure desugaring.
https://github.com/nikomatsakis/nll-rfc/blob/master/0000-non...
Basically, Rust makes you ensure that your code can actually do all the things it says it can do, not just the things it is currently doing. Personally, I find that very helpful; I would rather do the work up front than have to go back and fix a lot of things later as my code grows. This might be based on my experience designing and maintaining very long lived systems, where I wish I had been forced to do things correctly from the beginning.
This seems to be a common misconception, maybe from interacting with overzealous Rust fan clubbers.
But this is also a very different objection from your initial objection, which was just a statement of fact about type systems for turing complete languages.