Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use assoc types in the *Iterator traits #20441

Merged
merged 22 commits into from
Jan 4, 2015
Merged

Conversation

japaric
Copy link
Member

@japaric japaric commented Jan 2, 2015

Affected traits:

  • Iterator { type Item }
  • IteratorExt no input/output types, uses <Self as Iterator>::Item in its methods
  • DoubleEndedIterator no input/output types, uses <Self as Iterator>::Item in its methods
  • DoubleEndedIteratorExt no input/output types, uses <Self as Iterator>::Item in its methods
  • RandomAccessIterator no input/output types
  • ExactSizeIterator no input/output types, uses <Self as Iterator>::Item in its methods

This breaks all the implementations of these traits.

[breaking-change]


I was planning to use assoc types in the AdditiveIterator trait but that can't be done until this bug (#20400) is fixed.

r? @aturon

@aturon
Copy link
Member

aturon commented Jan 2, 2015

Other than a couple of possible mergers, this LGTM!

@bluss
Copy link
Member

bluss commented Jan 3, 2015

Is <Self as Iterator>::Item needed, doesn't Self::Item work?

@japaric
Copy link
Member Author

japaric commented Jan 3, 2015

@bluss Self::Item works if the assoc type is defined in the same trait, but it doesn't work with supertraits:

#![crate_type = "lib"]
#![feature(associated_types)]

trait Iterator {
    type Item;

    fn ok() -> Self::Item;
}

trait DoubleEndedIterator: Iterator {
    fn doesnt_work() -> Self::Item;
    fn works() -> <Self as Iterator>::Item;
}

Unless @nikomatsakis fixed it while I was sleeping ;-).

@nikomatsakis
Copy link
Contributor

💛

@japaric japaric mentioned this pull request Jan 3, 2015
bors added a commit that referenced this pull request Jan 4, 2015
closes #20486 
closes #20474 
closes #20441

[breaking-change]

The `Index[Mut]` traits now have one less input parameter, as the return type of the indexing operation is an associated type. This breaks all existing implementations.

---

binop traits (`Add`, `Sub`, etc) now have an associated type for their return type. Also, the RHS input parameter now defaults to `Self` (except for the `Shl` and `Shr` traits). For example, the `Add` trait now looks like this:

``` rust
trait Add<Rhs=Self> {
    type Output;

    fn add(self, Rhs) -> Self::Output;
}
```

The `Neg` and `Not` traits now also have an associated type for their return type.

This breaks all existing implementations of these traits.

---
Affected traits:

- `Iterator { type Item }`
- `IteratorExt` no input/output types, uses `<Self as Iterator>::Item` in its methods
- `DoubleEndedIterator` no input/output types, uses `<Self as Iterator>::Item` in its methods
- `DoubleEndedIteratorExt` no input/output types, uses `<Self as Iterator>::Item` in its methods
- `RandomAccessIterator` no input/output types
- `ExactSizeIterator` no input/output types, uses `<Self as Iterator>::Item` in its methods

This breaks all the implementations of these traits.
@bors bors merged commit 7095dd0 into rust-lang:master Jan 4, 2015
@japaric japaric deleted the at-iter branch January 4, 2015 13:05
kui added a commit to kui/racer that referenced this pull request Jan 5, 2015
This error is the following:

```
$ make
rustc -O -o bin/racer src/main.rs
src/racer/codeiter.rs:22:10: 22:32 error: wrong number of type arguments: expected 0, found 1
src/racer/codeiter.rs:22 impl<'a> Iterator<(uint, uint)> for StmtIndicesIter<'a> {
                                  ^~~~~~~~~~~~~~~~~~~~~~
```

This is caused by rust-lang/rust#20441
kui added a commit to kui/racer that referenced this pull request Jan 5, 2015
This error is the following:

```
$ make
rustc -O -o bin/racer src/main.rs
src/racer/codeiter.rs:22:10: 22:32 error: wrong number of type arguments: expected 0, found 1
src/racer/codeiter.rs:22 impl<'a> Iterator<(uint, uint)> for StmtIndicesIter<'a> {
                                  ^~~~~~~~~~~~~~~~~~~~~~
```

This is caused by <rust-lang/rust#20441>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants