I would say, that I am fairly advanced with rust and do understand the borrow checker in most situation. In this case however, I can't get my head around.
I try to solve a CodeSignal task. My solution looks like this (warning spoiler to everyone who wants to solve digitsProduct on her/his own!!!)
The compiler has to guess how it's supposed to capture the environment. I don't know exactly how it does this, but my mental model is: if the types check with borrowing, it borrows. This means that it sometimes guesses "borrow", when borrow checking later fails.
The solution is to ensure it captures the offending variable by value rather than by reference.