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
.
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;
#[derive(Debug)]
struct MyCollection(Vec<i32>);
impl MyCollection {
fn new() -> MyCollection {
MyCollection(Vec::new())
}
fn add(&mut self, elem: i32) {
self.0.push(elem);
}
}
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
}
}
let iter = (0..5).into_iter();
let c = MyCollection::from_iter(iter);
assert_eq!(c.0, vec![0, 1, 2, 3, 4]);
let iter = (0..5).into_iter();
let c: MyCollection = iter.collect();
assert_eq!(c.0, vec![0, 1, 2, 3, 4]);
Creates a value from an iterator.
See the module-level documentation for more.
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]);
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
and collects it into an Rc<[T]>
.
In the general case, collecting into Rc<[T]>
is done by first
collecting into a Vec<T>
. That is, when writing the following:
let evens: Rc<[u8]> = (0..10).filter(|&x| x % 2 == 0).collect();
this behaves as if we wrote:
let evens: Rc<[u8]> = (0..10).filter(|&x| x % 2 == 0)
.collect::<Vec<_>>()
.into();
This will allocate as many times as needed for constructing the Vec<T>
and then it will allocate once for turning the Vec<T>
into the Rc<[T]>
.
When your Iterator
implements TrustedLen
and is of an exact size,
a single allocation will be made for the Rc<[T]>
. For example:
let evens: Rc<[u8]> = (0..10).collect();
Takes each element in the Iterator
and collects it into an Arc<[T]>
.
In the general case, collecting into Arc<[T]>
is done by first
collecting into a Vec<T>
. That is, when writing the following:
let evens: Arc<[u8]> = (0..10).filter(|&x| x % 2 == 0).collect();
this behaves as if we wrote:
let evens: Arc<[u8]> = (0..10).filter(|&x| x % 2 == 0)
.collect::<Vec<_>>()
.into();
This will allocate as many times as needed for constructing the Vec<T>
and then it will allocate once for turning the Vec<T>
into the Arc<[T]>
.
When your Iterator
implements TrustedLen
and is of an exact size,
a single allocation will be made for the Arc<[T]>
. For example:
let evens: Arc<[u8]> = (0..10).collect();
impl<'a, 'b> FromIterator<&'b str> for Cow<'a, str>
[src][+]
impl<'a, T> FromIterator<T> for Cow<'a, [T]> where
T: Clone,
[src][+]
impl<A> FromIterator<A> for Box<[A]>
[src][+]
impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E> where
V: FromIterator<A>,
[src][+]
fn from_iter<I>(iter: I) -> Result<V, E> where
I: IntoIterator<Item = Result<A, E>>,
[src][−]
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.
impl<A, V> FromIterator<Option<A>> for Option<V> where
V: FromIterator<A>,
[src][+]
fn from_iter<I>(iter: I) -> Option<V> where
I: IntoIterator<Item = Option<A>>,
[src][−]
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.
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.
impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V> where
K: Ord,
[src][+]
impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S> where
K: Eq + Hash,
S: BuildHasher + Default,
[src][+]
impl<T> FromIterator<T> for BTreeSet<T> where
T: Ord,
[src][+]
impl<T> FromIterator<T> for BinaryHeap<T> where
T: Ord,
[src][+]
impl<T> FromIterator<T> for LinkedList<T>
[src][+]
impl<T> FromIterator<T> for Vec<T>
[src][+]
impl<T, S> FromIterator<T> for HashSet<T, S> where
S: BuildHasher + Default,
T: Eq + Hash,
[src][+]
impl FromIterator<Sides> for Sides
| |
impl<A: Array> FromIterator<<A as Array>::Item> for ArrayVec<A>
| |
impl<T> FromIterator<Steal<T>> for Steal<T>
| |
impl FromIterator<ColorMask> for ColorMask
| |
impl FromIterator<Mirror> for Mirror
| |
impl FromIterator<usize> for FixedBitSet
| |
impl<F: Future> FromIterator<F> for JoinAll<F>
| |
impl<Fut: Future + Unpin> FromIterator<Fut> for SelectAll<Fut>
| |
impl<F: TryFuture> FromIterator<F> for TryJoinAll<F>
| |
impl<Fut: TryFuture + Unpin> FromIterator<Fut> for SelectOk<Fut>
| |
impl<Fut: Future> FromIterator<Fut> for FuturesOrdered<Fut>
| |
impl<Fut> FromIterator<Fut> for FuturesUnordered<Fut>
| |
impl<St: Stream + Unpin> FromIterator<St> for SelectAll<St>
| |
impl FromIterator<Access> for Access
| |
impl FromIterator<Bind> for Bind
| |
impl FromIterator<Usage> for Usage
| |
impl FromIterator<DepthStencilFlags> for DepthStencilFlags
| |
impl FromIterator<DescriptorSetLayoutBinding> for DescriptorCounts
| |
impl FromIterator<Usage> for Usage
| |
impl FromIterator<Access> for Access
| |
impl FromIterator<CommandBufferFlags> for CommandBufferFlags
| |
impl FromIterator<Aspects> for Aspects
| |
impl FromIterator<ImageFeature> for ImageFeature
| |
impl FromIterator<BufferFeature> for BufferFeature
| |
impl FromIterator<ViewCapabilities> for ViewCapabilities
| |
impl FromIterator<Usage> for Usage
| |
impl FromIterator<Access> for Access
| |
impl FromIterator<Properties> for Properties
| |
impl FromIterator<Dependencies> for Dependencies
| |
impl FromIterator<CommandPoolCreateFlags> for CommandPoolCreateFlags
| |
impl FromIterator<DescriptorPoolCreateFlags> for DescriptorPoolCreateFlags
| |
impl FromIterator<ColorMask> for ColorMask
| |
impl FromIterator<Face> for Face
| |
impl FromIterator<PipelineStage> for PipelineStage
| |
impl FromIterator<ShaderStageFlags> for ShaderStageFlags
| |
impl FromIterator<PipelineCreationFlags> for PipelineCreationFlags
| |
impl FromIterator<ControlFlags> for ControlFlags
| |
impl FromIterator<ResultFlags> for ResultFlags
| |
impl FromIterator<PipelineStatistic> for PipelineStatistic
| |
impl FromIterator<PresentMode> for PresentMode
| |
impl FromIterator<CompositeAlphaMode> for CompositeAlphaMode
| |
impl FromIterator<Features> for Features
| |
impl FromIterator<u32> for BitSet
| |
impl<'a> FromIterator<&'a u32> for BitSet
| |
impl FromIterator<u32> for AtomicBitSet
| |
impl<'a> FromIterator<&'a u32> for AtomicBitSet
| |
impl FromIterator<ModifierKey> for ModifierKey
| |
impl<K: Hash + Eq, V, S: BuildHasher + Default> FromIterator<(K, V)> for LinkedHashMap<K, V, S>
| |
impl FromIterator<WriterFlags> for WriterFlags
| |
impl FromIterator<SamplingFlags> for SamplingFlags
| |
impl FromIterator<ImageFlags> for ImageFlags
| |
impl FromIterator<GlobalUse> for GlobalUse
| |
impl FromIterator<AtFlags> for AtFlags
| |
impl FromIterator<OFlag> for OFlag
| |
impl FromIterator<SealFlag> for SealFlag
| |
impl FromIterator<FdFlag> for FdFlag
| |
impl FromIterator<SpliceFFlags> for SpliceFFlags
| |
impl FromIterator<FallocateFlags> for FallocateFlags
| |
impl FromIterator<ModuleInitFlags> for ModuleInitFlags
| |
impl FromIterator<DeleteModuleFlags> for DeleteModuleFlags
| |
impl FromIterator<MsFlags> for MsFlags
| |
impl FromIterator<MntFlags> for MntFlags
| |
impl FromIterator<MQ_OFlag> for MQ_OFlag
| |
impl FromIterator<FdFlag> for FdFlag
| |
impl FromIterator<InterfaceFlags> for InterfaceFlags
| |
impl FromIterator<PollFlags> for PollFlags
| |
impl FromIterator<CloneFlags> for CloneFlags
| |
impl FromIterator<EpollFlags> for EpollFlags
| |
impl FromIterator<EpollCreateFlags> for EpollCreateFlags
| |
impl FromIterator<EfdFlags> for EfdFlags
| |
impl FromIterator<MemFdCreateFlag> for MemFdCreateFlag
| |
impl FromIterator<ProtFlags> for ProtFlags
| |
impl FromIterator<MapFlags> for MapFlags
| |
impl FromIterator<MsFlags> for MsFlags
| |
impl FromIterator<MlockAllFlags> for MlockAllFlags
| |
impl FromIterator<Options> for Options
| |
impl FromIterator<QuotaValidFlags> for QuotaValidFlags
| |
impl FromIterator<SaFlags> for SaFlags
| |
impl FromIterator<SfdFlags> for SfdFlags
| |
impl FromIterator<SockFlag> for SockFlag
| |
impl FromIterator<MsgFlags> for MsgFlags
| |
impl FromIterator<SFlag> for SFlag
| |
impl FromIterator<Mode> for Mode
| |
impl FromIterator<FsFlags> for FsFlags
| |
impl FromIterator<InputFlags> for InputFlags
| |
impl FromIterator<OutputFlags> for OutputFlags
| |
impl FromIterator<ControlFlags> for ControlFlags
| |
impl FromIterator<LocalFlags> for LocalFlags
| |
impl FromIterator<WaitPidFlag> for WaitPidFlag
| |
impl FromIterator<AddWatchFlags> for AddWatchFlags
| |
impl FromIterator<InitFlags> for InitFlags
| |
impl FromIterator<TimerFlags> for TimerFlags
| |
impl FromIterator<TimerSetTimeFlags> for TimerSetTimeFlags
| |
impl FromIterator<AccessFlags> for AccessFlags
| |
impl<T, S> FromIterator<T> for OrderSet<T, S> where T: Hash + Eq, S: BuildHasher + Default,
| |
impl<K, V, S> FromIterator<(K, V)> for OrderMap<K, V, S> where K: Hash + Eq, S: BuildHasher + Default,
| |
impl<N, E, Ty, Item> FromIterator<Item> for GraphMap<N, E, Ty> where Item: IntoWeightedEdge<E, NodeId = N>, N: NodeTrait, Ty: EdgeType,
| |
impl FromIterator<TokenTree> for TokenStream
| |
impl FromIterator<TokenStream> for TokenStream
| |
impl FromIterator<(String, Value)> for Map<String, Value>
| |
impl<T: Into<Value>> FromIterator<T> for Value
| |
impl<A: Array> FromIterator<<A as Array>::Item> for SmallVec<A>
| |
impl FromIterator<ImageOperands> for ImageOperands
| |
impl FromIterator<FPFastMathMode> for FPFastMathMode
| |
impl FromIterator<SelectionControl> for SelectionControl
| |
impl FromIterator<LoopControl> for LoopControl
| |
impl FromIterator<FunctionControl> for FunctionControl
| |
impl FromIterator<MemorySemantics> for MemorySemantics
| |
impl FromIterator<MemoryAccess> for MemoryAccess
| |
impl FromIterator<KernelProfilingInfo> for KernelProfilingInfo
| |
impl FromIterator<RayFlags> for RayFlags
| |
impl<T, P> FromIterator<T> for Punctuated<T, P> where P: Default,
| |
impl<T, P> FromIterator<Pair<T, P>> for Punctuated<T, P>
| |
impl FromIterator<CString> for RawDeviceExtensions
| |
impl FromIterator<CString> for RawInstanceExtensions
| |
impl FromIterator<DndAction> for DndAction
| |
impl FromIterator<Resize> for Resize
| |
impl FromIterator<Transient> for Transient
| |
impl FromIterator<Capability> for Capability
| |
impl FromIterator<Mode> for Mode
| |
impl FromIterator<ContentHint> for ContentHint
| |
impl FromIterator<Anchor> for Anchor
| |
impl FromIterator<Gravity> for Gravity
| |
impl FromIterator<ConstraintAdjustment> for ConstraintAdjustment
| |
impl FromIterator<Anchor> for Anchor
| |
impl FromIterator<Flags> for Flags
| |
impl FromIterator<ConstraintAdjustment> for ConstraintAdjustment
| |
impl FromIterator<PipelineFlags> for PipelineFlags
| |
impl FromIterator<BufferUse> for BufferUse
| |
impl FromIterator<TextureUse> for TextureUse
| |
impl FromIterator<BackendBit> for BackendBit
| |
impl FromIterator<Features> for Features
| |
impl FromIterator<ShaderStage> for ShaderStage
| |
impl FromIterator<ColorWrite> for ColorWrite
| |
impl FromIterator<BufferUsage> for BufferUsage
| |
impl FromIterator<TextureUsage> for TextureUsage
| |
impl FromIterator<ModifiersState> for ModifiersState
| |