Передавать статически направленную черту по ссылке / заимствованию [дубликат]

Посмотрите на этот пример:

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:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

2
задан Shepmaster 15 May 2015 в 00:42
поделиться

1 ответ

Я думаю, вы добавляете дополнительный слой косвенности. Метод 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()
}

Это очень запутанно, так что дайте мне знать, если мне нужно попытаться объяснить это по-другому.

3
ответ дан Shepmaster 27 August 2018 в 13:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: