Skip to main content

FromIterator

Trait FromIterator 

1.0.0 · Source
pub trait FromIterator<A>: Sized {
    // Required method
    fn from_iter<T>(iter: T) -> Self
       where T: IntoIterator<Item = A>;
}
Expand description

Conversion from an Iterator.

By implementing FromIterator for a type, you define how it will be created from an iterator. This is common for types which describe a collection of some kind.

If you want to create a collection from the contents of an iterator, the Iterator::collect() method is preferred. However, when you need to specify the container type, FromIterator::from_iter() can be more readable than using a turbofish (e.g. ::<Vec<_>>()). See the Iterator::collect() documentation for more examples of its use.

See also: IntoIterator.

§Examples

Basic usage:

let five_fives = std::iter::repeat(5).take(5);

let v = Vec::from_iter(five_fives);

assert_eq!(v, vec![5, 5, 5, 5, 5]);

Using Iterator::collect() to implicitly use FromIterator:

let five_fives = std::iter::repeat(5).take(5);

let v: Vec<i32> = five_fives.collect();

assert_eq!(v, vec![5, 5, 5, 5, 5]);

Using FromIterator::from_iter() as a more readable alternative to Iterator::collect():

use std::collections::VecDeque;
let first = (0..10).collect::<VecDeque<i32>>();
let second = VecDeque::from_iter(0..10);

assert_eq!(first, second);

Implementing FromIterator for your type:

// 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);
    }
}

// and we'll implement FromIterator
impl FromIterator<i32> for MyCollection {
    fn from_iter<I: IntoIterator<Item=i32>>(iter: I) -> Self {
        let mut c = MyCollection::new();

        for i in iter {
            c.add(i);
        }

        c
    }
}

// Now we can make a new iterator...
let iter = (0..5).into_iter();

// ... and make a MyCollection out of it
let c = MyCollection::from_iter(iter);

assert_eq!(c.0, vec![0, 1, 2, 3, 4]);

// collect works too!

let iter = (0..5).into_iter();
let c: MyCollection = iter.collect();

assert_eq!(c.0, vec![0, 1, 2, 3, 4]);

Required Methods§

1.0.0 · Source

fn from_iter<T>(iter: T) -> Self
where T: IntoIterator<Item = A>,

Creates a value from an iterator.

See the module-level documentation for more.

§Examples
let five_fives = std::iter::repeat(5).take(5);

let v = Vec::from_iter(five_fives);

assert_eq!(v, vec![5, 5, 5, 5, 5]);

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl FromIterator<(String, Value)> for otter_nodejs_tests::tera::Map<String, Value>

Source§

impl FromIterator<(String, Value)> for otter_nodejs_tests::toml::map::Map<String, Value>

Source§

impl FromIterator<Weekday> for WeekdaySet

Source§

impl FromIterator<AsciiChar> for String

Available on non-no_global_oom_handling only.
Source§

impl FromIterator<Signal> for SigSet

Available on crate feature signal only.
1.80.0 · Source§

impl FromIterator<char> for Box<str>

Available on non-no_global_oom_handling only.
Source§

impl FromIterator<char> for ByteString

1.0.0 · Source§

impl FromIterator<char> for String

Available on non-no_global_oom_handling only.
Source§

impl FromIterator<char> for BString

Source§

impl FromIterator<u8> for ByteString

Source§

impl FromIterator<u8> for BString

Source§

impl FromIterator<u8> for Bytes

Source§

impl FromIterator<u8> for BytesMut

1.23.0 · Source§

impl FromIterator<()> for ()

Collapses all unit items from an iterator into one.

This is more useful when combined with higher-level abstractions, like collecting to a Result<(), E> where you only care about errors:

use std::io::*;
let data = vec![1, 2, 3, 4, 5];
let res: Result<()> = data.iter()
    .map(|x| writeln!(stdout(), "{x}"))
    .collect();
assert!(res.is_ok());
Source§

impl FromIterator<AtFlags> for otter_nodejs_tests::nix::fcntl::AtFlags

Source§

impl FromIterator<FallocateFlags> for otter_nodejs_tests::nix::fcntl::FallocateFlags

Source§

impl FromIterator<FdFlag> for otter_nodejs_tests::nix::fcntl::FdFlag

Source§

impl FromIterator<OFlag> for OFlag

Source§

impl FromIterator<RenameFlags> for otter_nodejs_tests::nix::fcntl::RenameFlags

Source§

impl FromIterator<SealFlag> for SealFlag

Source§

impl FromIterator<SpliceFFlags> for SpliceFFlags

Source§

impl FromIterator<DeleteModuleFlags> for DeleteModuleFlags

Source§

impl FromIterator<ModuleInitFlags> for ModuleInitFlags

Source§

impl FromIterator<MntFlags> for MntFlags

Source§

impl FromIterator<MsFlags> for otter_nodejs_tests::nix::mount::MsFlags

Source§

impl FromIterator<FdFlag> for otter_nodejs_tests::nix::mqueue::FdFlag

Source§

impl FromIterator<MQ_OFlag> for MQ_OFlag

Source§

impl FromIterator<InterfaceFlags> for InterfaceFlags

Source§

impl FromIterator<PollFlags> for PollFlags

Source§

impl FromIterator<CloneFlags> for CloneFlags

Source§

impl FromIterator<EpollCreateFlags> for EpollCreateFlags

Source§

impl FromIterator<EpollFlags> for EpollFlags

Source§

impl FromIterator<EfdFlags> for EfdFlags

Source§

impl FromIterator<AddWatchFlags> for AddWatchFlags

Source§

impl FromIterator<InitFlags> for InitFlags

Source§

impl FromIterator<MemFdCreateFlag> for MemFdCreateFlag

Source§

impl FromIterator<MRemapFlags> for MRemapFlags

Source§

impl FromIterator<MapFlags> for MapFlags

Source§

impl FromIterator<MlockAllFlags> for MlockAllFlags

Source§

impl FromIterator<MsFlags> for otter_nodejs_tests::nix::sys::mman::MsFlags

Source§

impl FromIterator<ProtFlags> for ProtFlags

Source§

impl FromIterator<Persona> for Persona

Source§

impl FromIterator<Options> for Options

Source§

impl FromIterator<QuotaValidFlags> for QuotaValidFlags

Source§

impl FromIterator<SaFlags> for SaFlags

Source§

impl FromIterator<SfdFlags> for SfdFlags

Source§

impl FromIterator<MsgFlags> for MsgFlags

Source§

impl FromIterator<SockFlag> for SockFlag

Source§

impl FromIterator<TimestampingFlag> for TimestampingFlag

Source§

impl FromIterator<Mode> for otter_nodejs_tests::nix::sys::stat::Mode

Source§

impl FromIterator<SFlag> for SFlag

Source§

impl FromIterator<FsFlags> for FsFlags

Source§

impl FromIterator<ControlFlags> for ControlFlags

Source§

impl FromIterator<InputFlags> for InputFlags

Source§

impl FromIterator<LocalFlags> for LocalFlags

Source§

impl FromIterator<OutputFlags> for OutputFlags

Source§

impl FromIterator<TimerFlags> for TimerFlags

Source§

impl FromIterator<TimerSetTimeFlags> for TimerSetTimeFlags

Source§

impl FromIterator<WaitPidFlag> for WaitPidFlag

Source§

impl FromIterator<AccessFlags> for AccessFlags

Source§

impl FromIterator<ByteString> for ByteString

1.80.0 · Source§

impl FromIterator<String> for Box<str>

Available on non-no_global_oom_handling only.
1.4.0 · Source§

impl FromIterator<String> for String

Available on non-no_global_oom_handling only.
1.52.0 · Source§

impl FromIterator<OsString> for OsString

Source§

impl FromIterator<BString> for BString

Source§

impl FromIterator<FileType> for FileType

Source§

impl FromIterator<EventMask> for EventMask

Source§

impl FromIterator<WatchMask> for WatchMask

Source§

impl FromIterator<Op> for Op

Source§

impl FromIterator<CipherCtxFlags> for CipherCtxFlags

Source§

impl FromIterator<CMSOptions> for CMSOptions

Source§

impl FromIterator<OcspFlag> for OcspFlag

Source§

impl FromIterator<Pkcs7Flags> for Pkcs7Flags

Source§

impl FromIterator<ExtensionContext> for ExtensionContext

Source§

impl FromIterator<ShutdownState> for ShutdownState

Source§

impl FromIterator<SslMode> for SslMode

Source§

impl FromIterator<SslOptions> for SslOptions

Source§

impl FromIterator<SslSessionCacheMode> for SslSessionCacheMode

Source§

impl FromIterator<SslVerifyMode> for SslVerifyMode

Source§

impl FromIterator<X509CheckFlags> for X509CheckFlags

Source§

impl FromIterator<X509VerifyFlags> for X509VerifyFlags

Source§

impl FromIterator<Transformations> for Transformations

Source§

impl FromIterator<Literal> for Seq

Source§

impl FromIterator<CreateFlags> for CreateFlags

Source§

impl FromIterator<ReadFlags> for ReadFlags

Source§

impl FromIterator<WatchFlags> for WatchFlags

Source§

impl FromIterator<Access> for Access

Source§

impl FromIterator<AtFlags> for rustix::backend::fs::types::AtFlags

Source§

impl FromIterator<FallocateFlags> for rustix::backend::fs::types::FallocateFlags

Source§

impl FromIterator<MemfdFlags> for MemfdFlags

Source§

impl FromIterator<Mode> for rustix::backend::fs::types::Mode

Source§

impl FromIterator<OFlags> for OFlags

Source§

impl FromIterator<RenameFlags> for rustix::backend::fs::types::RenameFlags

Source§

impl FromIterator<ResolveFlags> for ResolveFlags

Source§

impl FromIterator<SealFlags> for SealFlags

Source§

impl FromIterator<StatVfsMountFlags> for StatVfsMountFlags

Source§

impl FromIterator<DupFlags> for DupFlags

Source§

impl FromIterator<FdFlags> for FdFlags

Source§

impl FromIterator<ReadWriteFlags> for ReadWriteFlags

Source§

impl FromIterator<IFlags> for IFlags

Source§

impl FromIterator<StatxAttributes> for StatxAttributes

Source§

impl FromIterator<StatxFlags> for StatxFlags

Source§

impl FromIterator<XattrFlags> for XattrFlags

Source§

impl<'a> FromIterator<&'a AsciiChar> for String

Available on non-no_global_oom_handling only.
1.80.0 · Source§

impl<'a> FromIterator<&'a char> for Box<str>

Available on non-no_global_oom_handling only.
1.17.0 · Source§

impl<'a> FromIterator<&'a char> for String

Available on non-no_global_oom_handling only.
1.80.0 · Source§

impl<'a> FromIterator<&'a str> for Box<str>

Available on non-no_global_oom_handling only.
Source§

impl<'a> FromIterator<&'a str> for ByteString

1.0.0 · Source§

impl<'a> FromIterator<&'a str> for String

Available on non-no_global_oom_handling only.
Source§

impl<'a> FromIterator<&'a str> for BString

Source§

impl<'a> FromIterator<&'a u8> for BytesMut

Source§

impl<'a> FromIterator<&'a ByteStr> for ByteString

1.52.0 · Source§

impl<'a> FromIterator<&'a OsStr> for OsString

Source§

impl<'a> FromIterator<&'a BStr> for BString

Source§

impl<'a> FromIterator<&'a [u8]> for ByteString

Source§

impl<'a> FromIterator<&'a [u8]> for BString

Source§

impl<'a> FromIterator<(Ident<'a>, Value<'a>)> for ParamsString

1.80.0 · Source§

impl<'a> FromIterator<Cow<'a, str>> for Box<str>

Available on non-no_global_oom_handling only.
1.19.0 · Source§

impl<'a> FromIterator<Cow<'a, str>> for String

Available on non-no_global_oom_handling only.
1.52.0 · Source§

impl<'a> FromIterator<Cow<'a, OsStr>> for OsString

Source§

impl<'a> FromIterator<AsciiChar> for Cow<'a, str>

Available on non-no_global_oom_handling only.
1.12.0 · Source§

impl<'a> FromIterator<char> for Cow<'a, str>

Available on non-no_global_oom_handling only.
1.12.0 · Source§

impl<'a> FromIterator<String> for Cow<'a, str>

Available on non-no_global_oom_handling only.
1.12.0 · Source§

impl<'a, 'b> FromIterator<&'b str> for Cow<'a, str>

Available on non-no_global_oom_handling only.
1.0.0 · Source§

impl<'a, T> FromIterator<T> for Cow<'a, [T]>
where T: Clone,

Source§

impl<A> FromIterator<<A as Array>::Item> for SmallVec<A>
where A: Array,

1.80.0 · Source§

impl<A> FromIterator<Box<str, A>> for Box<str>
where A: Allocator,

Available on non-no_global_oom_handling only.
1.45.0 · Source§

impl<A> FromIterator<Box<str, A>> for String
where A: Allocator,

Available on non-no_global_oom_handling only.
1.0.0 · Source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where V: FromIterator<A>,

1.0.0 · Source§

impl<A, V> FromIterator<Option<A>> for Option<V>
where V: FromIterator<A>,

Source§

impl<EntryData> FromIterator<EntryData> for VecList<EntryData>

Source§

impl<F> FromIterator<F> for JoinAll<F>
where F: Future,

Source§

impl<F> FromIterator<F> for TryJoinAll<F>
where F: TryFuture,

Source§

impl<Fut> FromIterator<Fut> for futures_util::future::select_all::SelectAll<Fut>
where Fut: Future + Unpin,

Source§

impl<Fut> FromIterator<Fut> for SelectOk<Fut>
where Fut: TryFuture + Unpin,

Source§

impl<Fut> FromIterator<Fut> for FuturesOrdered<Fut>
where Fut: Future,

Source§

impl<Fut> FromIterator<Fut> for FuturesUnordered<Fut>

1.32.0 · Source§

impl<I> FromIterator<I> for Box<[I]>

Available on non-no_global_oom_handling only.
Source§

impl<I, A> FromIterator<A> for Box<IndexSlice<I, [A]>>
where I: Idx,

Source§

impl<I, T> FromIterator<T> for IndexVec<I, T>
where I: Idx,

Source§

impl<K, V> FromIterator<(K, V)> for Value
where K: Into<String>, V: Into<Value>,

Source§

impl<K, V> FromIterator<(K, V)> for SecondaryMap<K, V>
where K: Key,

1.0.0 · Source§

impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
where K: Ord,

Source§

impl<K, V> FromIterator<(K, V)> for EnumMap<K, V>
where EnumMap<K, V>: Default, K: EnumArray<V>,

1.0.0 · Source§

impl<K, V, S> FromIterator<(K, V)> for otter_nodejs_tests::HashMap<K, V, S>
where K: Eq + Hash, S: BuildHasher + Default,

Source§

impl<K, V, S> FromIterator<(K, V)> for otter_nodejs_tests::IndexMap<K, V, S>
where K: Hash + Eq, S: BuildHasher + Default,

Source§

impl<K, V, S> FromIterator<(K, V)> for SparseSecondaryMap<K, V, S>
where K: Key, S: BuildHasher + Default,

Source§

impl<K, V, S> FromIterator<(K, V)> for indexmap::map::IndexMap<K, V, S>
where K: Hash + Eq, S: BuildHasher + Default,

Source§

impl<K, V, S> FromIterator<(K, V)> for LiteMap<K, V, S>
where K: Ord, S: StoreFromIterable<K, V>,

Source§

impl<K, V, S, A> FromIterator<(K, V)> for hashbrown::map::HashMap<K, V, S, A>
where K: Eq + Hash, S: BuildHasher + Default, A: Default + Allocator + Clone,

Source§

impl<K, V, S, A> FromIterator<(K, V)> for hashbrown::map::HashMap<K, V, S, A>
where K: Eq + Hash, S: BuildHasher + Default, A: Default + Allocator,

1.0.0 · Source§

impl<P> FromIterator<P> for PathBuf
where P: AsRef<Path>,

Source§

impl<St> FromIterator<St> for futures_util::stream::select_all::SelectAll<St>
where St: Stream + Unpin,

Source§

impl<T> FromIterator<(usize, T)> for Slab<T>

Create a slab from an iterator of key-value pairs.

If the iterator produces duplicate keys, the previous value is replaced with the later one. The keys does not need to be sorted beforehand, and this function always takes O(n) time. Note that the returned slab will use space proportional to the largest key, so don’t use Slab with untrusted keys.

§Examples


let vec = vec![(2,'a'), (6,'b'), (7,'c')];
let slab = vec.into_iter().collect::<Slab<char>>();
assert_eq!(slab.len(), 3);
assert!(slab.capacity() >= 8);
assert_eq!(slab[2], 'a');

With duplicate and unsorted keys:


let vec = vec![(20,'a'), (10,'b'), (11,'c'), (10,'d')];
let slab = vec.into_iter().collect::<Slab<char>>();
assert_eq!(slab.len(), 3);
assert_eq!(slab[10], 'd');
Source§

impl<T> FromIterator<(HeaderName, T)> for HeaderMap<T>

Source§

impl<T> FromIterator<Steal<T>> for Steal<T>

Source§

impl<T> FromIterator<T> for Value
where T: Into<Value>,

1.37.0 · Source§

impl<T> FromIterator<T> for Arc<[T]>

Available on non-no_global_oom_handling only.
1.0.0 · Source§

impl<T> FromIterator<T> for BTreeSet<T>
where T: Ord,

1.0.0 · Source§

impl<T> FromIterator<T> for VecDeque<T>

1.0.0 · Source§

impl<T> FromIterator<T> for BinaryHeap<T>
where T: Ord,

1.0.0 · Source§

impl<T> FromIterator<T> for LinkedList<T>

1.37.0 · Source§

impl<T> FromIterator<T> for Rc<[T]>

Available on non-no_global_oom_handling only.
1.0.0 · Source§

impl<T> FromIterator<T> for Vec<T>

Available on non-no_global_oom_handling only.

Collects an iterator into a Vec, commonly called via Iterator::collect()

§Allocation behavior

In general Vec does not guarantee any particular growth or allocation strategy. That also applies to this trait impl.

Note: This section covers implementation details and is therefore exempt from stability guarantees.

Vec may use any or none of the following strategies, depending on the supplied iterator:

  • preallocate based on Iterator::size_hint()
    • and panic if the number of items is outside the provided lower/upper bounds
  • use an amortized growth strategy similar to pushing one item at a time
  • perform the iteration in-place on the original allocation backing the iterator

The last case warrants some attention. It is an optimization that in many cases reduces peak memory consumption and improves cache locality. But when big, short-lived allocations are created, only a small fraction of their items get collected, no further use is made of the spare capacity and the resulting Vec is moved into a longer-lived structure, then this can lead to the large allocations having their lifetimes unnecessarily extended which can result in increased memory footprint.

In cases where this is an issue, the excess capacity can be discarded with Vec::shrink_to(), Vec::shrink_to_fit() or by collecting into Box<[T]> instead, which additionally reduces the size of the long-lived struct.

static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());

for i in 0..10 {
    let big_temporary: Vec<u16> = (0..1024).collect();
    // discard most items
    let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();
    // without this a lot of unused capacity might be moved into the global
    result.shrink_to_fit();
    LONG_LIVED.lock().unwrap().push(result);
}
1.79.0 · Source§

impl<T, ExtendT> FromIterator<(T₁, T₂, …, Tₙ)> for (ExtendT₁, ExtendT₂, …, ExtendTₙ)
where ExtendT: Default + Extend<T>,

This implementation turns an iterator of tuples into a tuple of types which implement Default and Extend.

This is similar to Iterator::unzip, but is also composable with other FromIterator implementations:

let string = "1,2,123,4";

// Example given for a 2-tuple, but 1- through 12-tuples are supported
let (numbers, lengths): (Vec<_>, Vec<_>) = string
    .split(',')
    .map(|s| s.parse().map(|n: u32| (n, s.len())))
    .collect::<Result<_, _>>()?;

assert_eq!(numbers, [1, 2, 123, 4]);
assert_eq!(lengths, [1, 1, 3, 1]);
Source§

impl<T, F> FromIterator<F> for JoinSet<T>
where F: Future<Output = T> + Send + 'static, T: Send + 'static,

Collect an iterator of futures into a JoinSet.

This is equivalent to calling JoinSet::spawn on each element of the iterator.

§Examples

The main example from JoinSet’s documentation can also be written using collect:

use tokio::task::JoinSet;

let mut set: JoinSet<_> = (0..10).map(|i| async move { i }).collect();

let mut seen = [false; 10];
while let Some(res) = set.join_next().await {
    let idx = res.unwrap();
    seen[idx] = true;
}

for i in 0..10 {
     assert!(seen[i]);
}
Source§

impl<T, I> FromIterator<T> for Deque<T, I>
where I: Offset,

Source§

impl<T, N> FromIterator<T> for GenericArray<T, N>
where N: ArrayLength<T>,

1.0.0 · Source§

impl<T, S> FromIterator<T> for otter_nodejs_tests::HashSet<T, S>
where T: Eq + Hash, S: BuildHasher + Default,

Source§

impl<T, S> FromIterator<T> for otter_nodejs_tests::IndexSet<T, S>
where T: Hash + Eq, S: BuildHasher + Default,

Source§

impl<T, S> FromIterator<T> for indexmap::set::IndexSet<T, S>
where T: Hash + Eq, S: BuildHasher + Default,

Source§

impl<T, S, A> FromIterator<T> for hashbrown::set::HashSet<T, S, A>
where T: Eq + Hash, S: BuildHasher + Default, A: Default + Allocator + Clone,

Source§

impl<T, S, A> FromIterator<T> for hashbrown::set::HashSet<T, S, A>
where T: Eq + Hash, S: BuildHasher + Default, A: Default + Allocator,

Source§

impl<T, const CAP: usize> FromIterator<T> for ArrayVec<T, CAP>

Create an ArrayVec from an iterator.

Panics if the number of elements in the iterator exceeds the arrayvec’s capacity.

Source§

impl<V> FromIterator<(usize, V)> for VecMap<V>