Trait grafix_toolbox::uses::iter::FromIterator 1.0.0[−][src]
pub trait FromIterator<A> {
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.
FromIterator::from_iter() is rarely called explicitly, and is instead
used through Iterator::collect() method. See Iterator::collect()’s
documentation for more examples.
See also: IntoIterator.
Examples
Basic usage:
use std::iter::FromIterator; 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]);
Implementing FromIterator for your type:
use std::iter::FromIterator; // 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
fn from_iter<T>(iter: T) -> Self where
T: IntoIterator<Item = A>,
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
Basic usage:
use std::iter::FromIterator; 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]);
Implementations on Foreign Types
impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S> where
S: BuildHasher + Default,
K: Eq + Hash,
impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S> where
S: BuildHasher + Default,
K: Eq + Hash, Takes each element in the Iterator: if it is None,
no further elements are taken, and the None is
returned. Should no None occur, a container with the
values of each Option is returned.
Examples
Here is an example which increments every integer in a vector.
We use the checked variant of add that returns None when the
calculation would result in an overflow.
let items = vec![0_u16, 1, 2]; let res: Option<Vec<u16>> = items .iter() .map(|x| x.checked_add(1)) .collect(); assert_eq!(res, Some(vec![1, 2, 3]));
As you can see, this will return the expected, valid items.
Here is another example that tries to subtract one from another list of integers, this time checking for underflow:
let items = vec![2_u16, 1, 0]; let res: Option<Vec<u16>> = items .iter() .map(|x| x.checked_sub(1)) .collect(); assert_eq!(res, None);
Since the last element is zero, it would underflow. Thus, the resulting
value is None.
Here is a variation on the previous example, showing that no
further elements are taken from iter after the first None.
let items = vec![3_u16, 2, 1, 10]; let mut shared = 0; let res: Option<Vec<u16>> = items .iter() .map(|x| { shared += x; x.checked_sub(2) }) .collect(); assert_eq!(res, None); assert_eq!(shared, 6);
Since the third element caused an underflow, no further elements were taken,
so the final value of shared is 6 (= 3 + 2 + 1), not 16.
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());
Takes each element in the Iterator: if it is an Err, no further
elements are taken, and the Err is returned. Should no Err occur, a
container with the values of each Result is returned.
Here is an example which increments every integer in a vector, checking for overflow:
let v = vec![1, 2]; let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| x.checked_add(1).ok_or("Overflow!") ).collect(); assert_eq!(res, Ok(vec![2, 3]));
Here is another example that tries to subtract one from another list of integers, this time checking for underflow:
let v = vec![1, 2, 0]; let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| x.checked_sub(1).ok_or("Underflow!") ).collect(); assert_eq!(res, Err("Underflow!"));
Here is a variation on the previous example, showing that no
further elements are taken from iter after the first Err.
let v = vec![3, 2, 1, 10]; let mut shared = 0; let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| { shared += x; x.checked_sub(2).ok_or("Underflow!") }).collect(); assert_eq!(res, Err("Underflow!")); assert_eq!(shared, 6);
Since the third element caused an underflow, no further elements were taken,
so the final value of shared is 6 (= 3 + 2 + 1), not 16.
pub fn from_iter<T>(iter: T) -> Box<[I], Global>ⓘNotable traits for Box<R, Global>
impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<F, A> Future for Box<F, A> where
A: Allocator + 'static,
F: Future + Unpin + ?Sized, type Output = <F as Future>::Output;impl<I, A> Iterator for Box<I, A> where
A: Allocator,
I: Iterator + ?Sized, type Item = <I as Iterator>::Item; where
T: IntoIterator<Item = I>, impl FromIterator<Transformations> for Transformations
impl FromIterator<Transformations> for Transformationspub fn from_iter<T>(iterator: T) -> Transformations where
T: IntoIterator<Item = Transformations>, impl<K, V, S> FromIterator<(K, V)> for AHashMap<K, V, S> where
S: BuildHasher + Default,
K: Eq + Hash,
impl<K, V, S> FromIterator<(K, V)> for AHashMap<K, V, S> where
S: BuildHasher + Default,
K: Eq + Hash, pub fn from_iter<T>(iter: T) -> AHashMap<K, V, S> where
T: IntoIterator<Item = (K, V)>, impl<T, S> FromIterator<T> for AHashSet<T, S> where
S: BuildHasher + Default,
T: Eq + Hash,
impl<T, S> FromIterator<T> for AHashSet<T, S> where
S: BuildHasher + Default,
T: Eq + Hash, pub fn from_iter<I>(iter: I) -> AHashSet<T, S> where
I: IntoIterator<Item = T>, impl<T> FromIterator<(usize, T)> for Slab<T>
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');
pub fn from_iter<I>(iterable: I) -> Slab<T> where
I: IntoIterator<Item = (usize, T)>, Convert an iteratable type to a Value
Examples
use serde_json::Value; let v = std::iter::repeat(42).take(5); let x: Value = v.collect();
use serde_json::Value; let v: Vec<_> = vec!["lorem", "ipsum", "dolor"]; let x: Value = v.into_iter().collect();
use std::iter::FromIterator; use serde_json::Value; let x: Value = Value::from_iter(vec!["lorem", "ipsum", "dolor"]);
Implementors
impl<K, V, S, A> FromIterator<(K, V)> for grafix_toolbox::uses::HashMap<K, V, S, A> where
S: BuildHasher + Default,
A: Default + Allocator + Clone,
K: Eq + Hash, impl<T, S, A> FromIterator<T> for grafix_toolbox::uses::HashSet<T, S, A> where
S: BuildHasher + Default,
T: Eq + Hash,
A: Default + Allocator + Clone,