Посмотрите на этот пример:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope,$http) {
var getJoke = function(){
return $http.get('http://api.icndb.com/jokes/random').then(function(res){
return res.data.value;
});
}
getJoke().then(function(res) {
console.log(res.joke);
});
});
Как вы можете видеть, getJoke
возвращает разрешенное обещание (оно разрешено при возврате res.data.value
). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).
Это plnkr:
Я думаю, вы добавляете дополнительный слой косвенности. Метод 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()
}
Это очень запутанно, так что дайте мне знать, если мне нужно попытаться объяснить это по-другому.