diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-01-30 12:02:44 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-01-30 12:02:44 -0800 |
| commit | 341e858bd882061b823dac236fd718d473f8ab2e (patch) | |
| tree | 2e6d18523dcd67f28fe0a527f02102072ce14996 /src/rustllvm/RustWrapper.cpp | |
| parent | 1a51eb9cca3ae5f815825096de4dfbdc9267f735 (diff) | |
| parent | b9a9030ed68f135e116e9a5d32663e00b897cf4f (diff) | |
| download | rust-341e858bd882061b823dac236fd718d473f8ab2e.tar.gz rust-341e858bd882061b823dac236fd718d473f8ab2e.zip | |
rollup merge of #20790: japaric/for-loops
As per [RFC #235][rfc], you can now do:
[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
``` rust
let mut v = vec![1];
// iterate over immutable references
for x in &v {
assert_eq!(x, &1);
}
// iterate over mutable references
for x in &mut v {
assert_eq!(x, &mut 1);
}
// iterate over values, this consumes `v`
for x in v {
assert_eq!(x, 1);
}
```
[breaking-change]s
For loops now "consume" (move) the iterator, this breaks iterating over mutable references to iterators, and also breaks multiple iterations over the same iterator:
``` rust
fn foo(mut it: &mut Iter) { // `Iter` implements `Iterator`
for x in it { .. } //~ error: `&mut Iter` doesn't implement Iterator
}
fn bar() {
for x in it { .. } //~ note: `it` moved here
for x in it { .. } //~ error: `it` has been moved
}
```
Both cases can be fixed using the `by_ref()` adapter to create an iterator from the mutable reference:
``` rust
fn foo(mut it: &mut Iter) {
for x in it.by_ref() { .. }
}
fn bar() {
for x in it.by_ref() { .. }
for x in it { .. }
}
```
This PR also makes iterator non-implicitly copyable, as this was source of subtle bugs in the libraries. You can still use `clone()` to explictly copy the iterator.
Finally, since the for loops are implemented in the frontend and use global paths to `IntoIterator`, `Iterator` and `Option` variants, users of the `core` crate will have to use add an `std` module to the root of their crate to be able to use for loops:
``` rust
#![no_std]
extern crate core;
fn main() {
for x in 0..10 {}
}
#[doc(hidden)]
mod std {
// these imports are needed to use for-loops
pub use core::iter;
pub use core::option;
}
```
---
r? @nikomatsakis @aturon
cc #18424
closes #18045
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions
