pub trait Extend<A> {
// Required method
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T);
// Provided methods
fn extend_one(&mut self, item: A) { ... }
fn extend_reserve(&mut self, additional: usize) { ... }
#[doc(hidden)] unsafe fn extend_one_unchecked(&mut self, item: A)
where Self: Sized { ... }
}Expand description
Extend a collection with the contents of an iterator.
Iterators produce a series of values, and collections can also be thought
of as a series of values. The Extend trait bridges this gap, allowing you
to extend a collection by including the contents of that iterator. When
extending a collection with an already existing key, that entry is updated
or, in the case of collections that permit multiple entries with equal
keys, that entry is inserted.
§Examples
Basic usage:
// You can extend a String with some chars:
let mut message = String::from("The first three letters are: ");
message.extend(&['a', 'b', 'c']);
assert_eq!("abc", &message[29..32]);Implementing Extend:
// A sample collection, that's just a wrapper over Vec<T>
#[derive(Debug)]
struct MyCollection(Vec<i32>);
// Let's give it some methods so we can create one and add things
// to it.
impl MyCollection {
fn new() -> MyCollection {
MyCollection(Vec::new())
}
fn add(&mut self, elem: i32) {
self.0.push(elem);
}
}
// since MyCollection has a list of i32s, we implement Extend for i32
impl Extend<i32> for MyCollection {
// This is a bit simpler with the concrete type signature: we can call
// extend on anything which can be turned into an Iterator which gives
// us i32s. Because we need i32s to put into MyCollection.
fn extend<T: IntoIterator<Item=i32>>(&mut self, iter: T) {
// The implementation is very straightforward: loop through the
// iterator, and add() each element to ourselves.
for elem in iter {
self.add(elem);
}
}
}
let mut c = MyCollection::new();
c.add(5);
c.add(6);
c.add(7);
// let's extend our collection with three more numbers
c.extend(vec![1, 2, 3]);
// we've added these elements onto the end
assert_eq!("MyCollection([5, 6, 7, 1, 2, 3])", format!("{c:?}"));Required Methods§
1.0.0 · Sourcefn extend<T: IntoIterator<Item = A>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T)
Extends a collection with the contents of an iterator.
As this is the only required method for this trait, the trait-level docs contain more details.
§Examples
Provided Methods§
Sourcefn extend_one(&mut self, item: A)
🔬This is a nightly-only experimental API. (extend_one #72631)
fn extend_one(&mut self, item: A)
extend_one #72631)Extends a collection with exactly one element.
Sourcefn extend_reserve(&mut self, additional: usize)
🔬This is a nightly-only experimental API. (extend_one #72631)
fn extend_reserve(&mut self, additional: usize)
extend_one #72631)Reserves capacity in a collection for the given number of additional elements.
The default implementation does nothing.
Source#[doc(hidden)]unsafe fn extend_one_unchecked(&mut self, item: A)where
Self: Sized,
🔬This is a nightly-only experimental API. (extend_one_unchecked)
#[doc(hidden)]unsafe fn extend_one_unchecked(&mut self, item: A)where
Self: Sized,
extend_one_unchecked)Extends a collection with one element, without checking there is enough capacity for it.
§Safety
For callers: This must only be called when we know the collection has enough capacity
to contain the new item, for example because we previously called extend_reserve.
For implementors: For a collection to unsafely rely on this method’s safety precondition (that is,
invoke UB if they are violated), it must implement extend_reserve correctly. In other words,
callers may assume that if they extend_reserveed enough space they can call this method.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementors§
impl Extend<()> for ()
impl<A, B, C, D, E, ExA, ExB, ExC, ExD, ExE> Extend<(A, B, C, D, E)> for (ExA, ExB, ExC, ExD, ExE)
impl<A, B, C, D, E, F, ExA, ExB, ExC, ExD, ExE, ExF> Extend<(A, B, C, D, E, F)> for (ExA, ExB, ExC, ExD, ExE, ExF)
impl<A, B, C, D, E, F, G, ExA, ExB, ExC, ExD, ExE, ExF, ExG> Extend<(A, B, C, D, E, F, G)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG)
impl<A, B, C, D, E, F, G, H, ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH> Extend<(A, B, C, D, E, F, G, H)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH)
impl<A, B, C, D, E, F, G, H, I, ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI> Extend<(A, B, C, D, E, F, G, H, I)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI)
impl<A, B, C, D, E, F, G, H, I, J, ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ> Extend<(A, B, C, D, E, F, G, H, I, J)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ)
impl<A, B, C, D, E, F, G, H, I, J, K, ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ, ExK> Extend<(A, B, C, D, E, F, G, H, I, J, K)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ, ExK)
impl<A, B, C, D, E, F, G, H, I, J, K, L, ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ, ExK, ExL> Extend<(A, B, C, D, E, F, G, H, I, J, K, L)> for (ExA, ExB, ExC, ExD, ExE, ExF, ExG, ExH, ExI, ExJ, ExK, ExL)
impl<A, B, C, D, ExA, ExB, ExC, ExD> Extend<(A, B, C, D)> for (ExA, ExB, ExC, ExD)
impl<A, B, C, ExA, ExB, ExC> Extend<(A, B, C)> for (ExA, ExB, ExC)
impl<A, B, ExA, ExB> Extend<(A, B)> for (ExA, ExB)
impl<T, ExtendT> Extend<(T₁, T₂, …, Tₙ)> for (ExtendT₁, ExtendT₂, …, ExtendTₙ)where
ExtendT: Extend<T>,
This trait is implemented for tuples up to twelve items long. The impls for
1- and 3- through 12-ary tuples were stabilized after 2-tuples, in 1.85.0.