rustmax::cxx_build::std::prelude::rust_2024

Trait FromIterator

Source
pub trait FromIterator<A>: Sized {
    // Required method
    fn from_iter<T>(iter: T) -> Self
       where T: IntoIterator<Item = A>;
}
๐Ÿ”ฌThis is a nightly-only experimental API. (prelude_2024)
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", so this trait is not object safe.

Implementorsยง

Sourceยง

impl FromIterator<(Key, Value)> for Fields

Sourceยง

impl FromIterator<(Key, Value)> for Keywords

Sourceยง

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

Sourceยง

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

Sourceยง

impl FromIterator<Signal> for SigSet

Sourceยง

impl FromIterator<TokenTree> for rustmax::proc_macro2::TokenStream

Collects a number of token trees into a single stream.

1.29.0 ยท Sourceยง

impl FromIterator<TokenTree> for rustmax::proc_macro::TokenStream

Collects a number of token trees into a single stream.

Sourceยง

impl FromIterator<char> for BString

1.80.0 ยท Sourceยง

impl FromIterator<char> for Box<str>

1.0.0 ยท Sourceยง

impl FromIterator<char> for String

Sourceยง

impl FromIterator<u8> for BString

Sourceยง

impl FromIterator<u8> for BytesMut

Sourceยง

impl FromIterator<u8> for Bytes

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<usize> for FlexZeroVec<'_>

Sourceยง

impl FromIterator<usize> for FlexZeroVecOwned

Sourceยง

impl FromIterator<usize> for VarBitSet

Sourceยง

impl FromIterator<BString> for BString

Sourceยง

impl FromIterator<FileType> for FileType

Sourceยง

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

Sourceยง

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

Sourceยง

impl FromIterator<FdFlag> for FdFlag

Sourceยง

impl FromIterator<OFlag> for OFlag

Sourceยง

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

Sourceยง

impl FromIterator<ResolveFlag> for ResolveFlag

Sourceยง

impl FromIterator<SealFlag> for SealFlag

Sourceยง

impl FromIterator<PollFlags> for PollFlags

Sourceยง

impl FromIterator<MemFdCreateFlag> for MemFdCreateFlag

Sourceยง

impl FromIterator<SaFlags> for SaFlags

Sourceยง

impl FromIterator<SfdFlags> for SfdFlags

Sourceยง

impl FromIterator<Mode> for 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<WaitPidFlag> for WaitPidFlag

Sourceยง

impl FromIterator<AccessFlags> for AccessFlags

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<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<StatxFlags> for StatxFlags

Sourceยง

impl FromIterator<DupFlags> for DupFlags

Sourceยง

impl FromIterator<FdFlags> for FdFlags

Sourceยง

impl FromIterator<ReadWriteFlags> for ReadWriteFlags

Sourceยง

impl FromIterator<MountFlags> for MountFlags

Sourceยง

impl FromIterator<MountPropagationFlags> for MountPropagationFlags

Sourceยง

impl FromIterator<UnmountFlags> for UnmountFlags

Sourceยง

impl FromIterator<IFlags> for IFlags

Sourceยง

impl FromIterator<XattrFlags> for XattrFlags

Sourceยง

impl FromIterator<Table> for ArrayOfTables

Sourceยง

impl FromIterator<CodegenConfig> for CodegenConfig

Sourceยง

impl FromIterator<TokenStream> for rustmax::proc_macro2::TokenStream

1.15.0 ยท Sourceยง

impl FromIterator<TokenStream> for rustmax::proc_macro::TokenStream

A โ€œflatteningโ€ operation on token streams, collects token trees from multiple token streams into a single stream.

Sourceยง

impl FromIterator<Modifiers> for Modifiers

Sourceยง

impl FromIterator<Comparator> for VersionReq

1.52.0 ยท Sourceยง

impl FromIterator<OsString> for OsString

Sourceยง

impl FromIterator<RangeInclusive<u32>> for CodePointInversionList<'_>

1.80.0 ยท Sourceยง

impl FromIterator<String> for Box<str>

1.4.0 ยท Sourceยง

impl FromIterator<String> for String

1.80.0 ยท Sourceยง

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

1.17.0 ยท Sourceยง

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

Sourceยง

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

Sourceยง

impl<'a> FromIterator<&'a str> for CodePointInversionListAndStringList<'_>

1.80.0 ยท Sourceยง

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

1.0.0 ยท Sourceยง

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

Sourceยง

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

Sourceยง

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

1.52.0 ยท Sourceยง

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

Sourceยง

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

1.80.0 ยท Sourceยง

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

1.19.0 ยท Sourceยง

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

1.52.0 ยท Sourceยง

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

1.12.0 ยท Sourceยง

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

1.12.0 ยท Sourceยง

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

1.12.0 ยท Sourceยง

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

Sourceยง

impl<'a, A, B, C, K0, K1, V> FromIterator<(A, B, C)> for ZeroMap2d<'a, K0, K1, V>
where A: Borrow<K0>, B: Borrow<K1>, C: Borrow<V>, K0: ZeroMapKV<'a> + Ord + ?Sized, K1: ZeroMapKV<'a> + Ord + ?Sized, V: ZeroMapKV<'a> + ?Sized,

Sourceยง

impl<'a, A, B, K, V> FromIterator<(A, B)> for ZeroMap<'a, K, V>
where A: Borrow<K>, B: Borrow<V>, K: ZeroMapKV<'a> + Ord + ?Sized, V: ZeroMapKV<'a> + ?Sized,

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,

1.45.0 ยท Sourceยง

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

1.79.0 ยท Sourceยง

impl<A, B, AE, BE> FromIterator<(AE, BE)> for (A, B)
where A: Default + Extend<AE>, B: Default + Extend<BE>,

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";

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]);
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<B> FromIterator<bool> for BitVec<B>
where B: BitBlock,

Sourceยง

impl<B> FromIterator<usize> for BitSet<B>
where B: BitBlock,

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 rustmax::futures::prelude::future::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]>

Sourceยง

impl<K, V> FromIterator<(K, V)> for toml_edit::value::Value
where K: Into<Key>, V: Into<Value>,

Sourceยง

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

Sourceยง

impl<K, V> FromIterator<(K, V)> for Trie<K, V>
where K: TrieKey,

Sourceยง

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

Sourceยง

impl<K, V> FromIterator<(K, V)> for Table
where K: Into<Key>, V: Into<Item>,

Sourceยง

impl<K, V> FromIterator<(K, V)> for AHashMap<K, V>
where K: Eq + Hash,

1.0.0 ยท Sourceยง

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

Sourceยง

impl<K, V, S> FromIterator<(K, V)> for 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>,

1.0.0 ยท Sourceยง

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

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 rustmax::futures::prelude::stream::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 rustmax::tera::Value
where T: Into<Value>,

Sourceยง

impl<T> FromIterator<T> for ZeroVec<'_, T>
where T: AsULE,

Sourceยง

impl<T> FromIterator<T> for AHashSet<T>
where T: Eq + Hash,

1.0.0 ยท Sourceยง

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

1.0.0 ยท Sourceยง

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

1.0.0 ยท Sourceยง

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

1.0.0 ยท Sourceยง

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

1.37.0 ยท Sourceยง

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

1.37.0 ยท Sourceยง

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

1.0.0 ยท Sourceยง

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

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

#[tokio::main]
async fn main() {
    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, N> FromIterator<T> for GenericArray<T, N>
where N: ArrayLength<T>,

Sourceยง

impl<T, P> FromIterator<Pair<T, P>> for Punctuated<T, P>

Sourceยง

impl<T, P> FromIterator<T> for Punctuated<T, P>
where P: Default,

Sourceยง

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

1.0.0 ยท Sourceยง

impl<T, S> FromIterator<T> for rustmax::std::collections::HashSet<T, S>
where T: Eq + Hash, 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,

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<T, const N: usize> FromIterator<T> for ArrayFromIter<T, N>

Sourceยง

impl<V> FromIterator<V> for toml_edit::value::Value
where V: Into<Value>,

Sourceยง

impl<V> FromIterator<V> for Array
where V: Into<Value>,