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", so this trait is not object safe.

Implementors§

Source§

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

Source§

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

1.29.0 · Source§

impl FromIterator<TokenTree> for proc_macro::TokenStream

Collects a number of token trees into a single stream.

Source§

impl FromIterator<Styles> for Style

Source§

impl FromIterator<TokenTree> for proc_macro2::TokenStream

Collects a number of token trees into a single stream.

Source§

impl FromIterator<char> for ByteString

1.80.0 · Source§

impl FromIterator<char> for Box<str>

1.0.0 · Source§

impl FromIterator<char> for String

Source§

impl FromIterator<u8> for ByteString

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

1.15.0 · Source§

impl FromIterator<TokenStream> for proc_macro::TokenStream

A “flattening” operation on token streams, collects token trees from multiple token streams into a single stream.

1.52.0 · Source§

impl FromIterator<OsString> for OsString

Source§

impl FromIterator<TokenStream> for proc_macro2::TokenStream

Source§

impl FromIterator<RefTypes> for RefTypes

Source§

impl FromIterator<Nibble> for NibblePath

Convert a vector of bytes into NibblePath using the lower 4 bits of each byte as nibble.

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 AtFlags

Source§

impl FromIterator<FallocateFlags> for FallocateFlags

Source§

impl FromIterator<MemfdFlags> for MemfdFlags

Source§

impl FromIterator<Mode> for Mode

Source§

impl FromIterator<OFlags> for OFlags

Source§

impl FromIterator<RenameFlags> for 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 FromIterator<Comparator> for VersionReq

Source§

impl FromIterator<Table> for ArrayOfTables

Source§

impl FromIterator<EnabledModules> for EnabledModules

Source§

impl FromIterator<EventFlags> for EventFlags

Source§

impl FromIterator<LockFlags> for LockFlags

1.80.0 · Source§

impl FromIterator<String> for Box<str>

1.4.0 · Source§

impl FromIterator<String> for String

Source§

impl FromIterator<VaultFreezeFlags> for VaultFreezeFlags

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 ByteString

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 ByteStr> for ByteString

1.52.0 · Source§

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

Source§

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

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>

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,

Source§

impl<A> FromIterator<A> for triomphe::arc::Arc<[A]>

Source§

impl<A> FromIterator<A> for UniqueArc<[A]>

1.0.0 · Source§

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

1.79.0 · Source§

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

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

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.

1.0.0 · Source§

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

1.32.0 · Source§

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

Source§

impl<Idx, T> FromIterator<T> for DedupArena<Idx, T>
where Idx: ArenaIndex, T: Hash + Clone + Ord,

Source§

impl<Idx, T> FromIterator<T> for Arena<Idx, T>

Source§

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

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 indexmap_nostd::map::IndexMap<K, V>
where K: Ord + Clone,

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<Value>,

Source§

impl<K, V> FromIterator<(K, V)> for wasmi_collections::map::Map<K, V>
where K: Hash + Eq + Ord,

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 NonIterMap<K, V>
where K: Hash + Eq,

1.0.0 · Source§

impl<K, V, S> FromIterator<(K, V)> for scrypto_test::prelude::hash_map::ext_HashMap<K, V, S>
where K: Eq + Hash, 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 scrypto_test::prelude::indexmap::IndexMap<K, V, S>
where K: Hash + Eq, 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 + 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<T> FromIterator<(NonZero<usize>, T)> for MultiStash<T>

Source§

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

1.0.0 · Source§

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

Source§

impl<T> FromIterator<T> for indexmap_nostd::set::IndexSet<T>
where T: Ord + Clone,

Source§

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

1.37.0 · Source§

impl<T> FromIterator<T> for scrypto_test::prelude::Arc<[T]>

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.37.0 · Source§

impl<T> FromIterator<T> for Rc<[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);
}
1.0.0 · Source§

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

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,

1.0.0 · Source§

impl<T, S> FromIterator<T> for scrypto_test::prelude::hash_set::ext_HashSet<T, S>
where T: Eq + Hash, 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> FromIterator<T> for scrypto_test::prelude::indexmap::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<V> for toml_edit::value::Value
where V: Into<Value>,

Source§

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