Я думаю, вы добавляете дополнительный слой косвенности. Метод call self.delegate.next()
desugars в Next::next(self.delegate)
в этом случае - не требуется автоматическая ссылка (измененная или иная).
Сообщение об ошибке запутывается, потому что у вас есть два уровня ссылки. Ваша черта написана:
trait Next {
fn next(&mut self)
}
Это означает, что вам всегда нужно пройти в &mut Foo
. Однако вы использовали вторую изменяемую ссылку, создав тип аргумента &mut &mut NextImpl<Type>
. Первый &mut
соответствует параметру функции, но тогда остаток типа должен реализовать Next
. Однако &mut NextImpl<Type>
не реализует эту черту, только NextImpl<Type>
делает!
Ваша проблема Sized
очень похожа. Функция определена как
fn iterator_next2<It: Iterator>(iter: &mut It) -> Option<It::Item>
То есть она ожидает изменчивую ссылку на определенный конкретный тип, который реализует Iterator
. Ваш вызов проходит через &mut Iterator
- объект объекта . Объект-признак является ссылкой на что-то без известного размера, известно только, что он реализует методы этого признака. Поскольку вы не заботитесь о размере вещи, на которую ссылается, правильным вариантом является заявить, что, как и вы:
fn iterator_next3<It: Iterator + ?Sized>(iter: &mut It) -> Option<It::Item> {
iter.next()
}
Это очень запутанно, так что дайте мне знать, если мне нужно попытаться объяснить это по-другому.