Структура std::vec::Vec
реализует два вида расширения, как указано здесь - impl<'a, T> Extend<&'a T> for Vec<T>
и impl<T> Extend<T> for Vec<T>
. В документации говорится, что первый тип - это «Расширяемая реализация, которая копирует элементы из ссылок, прежде чем помещать их в Ve c». Я довольно новичок в Rust, и я не уверен, правильно ли я понимаю.
Я бы предположил, что первый тип используется с эквивалентом нормальных итераторов C ++, а второй - используется с эквивалентом итераторов перемещения C ++.
Я пытаюсь написать функцию, которая принимает любую структуру данных, которая позволит вставлять i32
s в конец, поэтому я беру параметр, который реализует оба вида Extend
, но я не могу понять, как задать параметры generi c, чтобы заставить его работать:
fn main() {
let mut vec = std::vec::Vec::<i32>::new();
add_stuff(&mut vec);
}
fn add_stuff<'a, Rec: std::iter::Extend<i32> + std::iter::Extend<&'a i32>>(receiver: &mut Rec) {
let x = 1 + 4;
receiver.extend(&[x]);
}
Компилятор жалуется, что &[x]
"создает временный объект, который освобождается, пока все еще используется », что имеет смысл, потому что 'a
приходит извне функции add_stuff
. Но, конечно, я хочу, чтобы receiver.extend(&[x])
скопировал элемент из фрагмента временного массива и добавил его в конец контейнера, чтобы временный массив больше не использовался после возврата receiver.extend
. Как правильно express что я хочу?