Skip to content

Commit

Permalink
Merge pull request #111 from pcwalton/index-traits
Browse files Browse the repository at this point in the history
RFC for index traits
  • Loading branch information
pcwalton committed Jun 25, 2014
2 parents fee471d + 4ca734f commit c9c0fdb
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions active/0034-index-traits.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
- Start Date: 2014-06-09
- RFC PR #: #111
- Rust Issue #: #6515

# Summary

`Index` should be split into `Index` and `IndexMut`.

# Motivation

Currently, the `Index` trait is not suitable for most array indexing tasks. The slice functionality cannot be replicated using it, and as a result the new `Vec` has to use `.get()` and `.get_mut()` methods.

Additionally, this simply follows the `Deref`/`DerefMut` split that has been implemented for a while.

# Detailed design

We split `Index` into two traits (borrowed from @nikomatsakis):

// self[element] -- if used as rvalue, implicitly a deref of the result
trait Index<E,R> {
fn index<'a>(&'a self, element: &E) -> &'a R;
}

// &mut self[element] -- when used as a mutable lvalue
trait IndexMut<E,R> {
fn index_mut<'a>(&'a mut self, element: &E) -> &'a mut R;
}

# Drawbacks

* The number of lang. items increases.

* This design doesn't support moving out of a vector-like object. This can be added backwards compatibly.

* This design doesn't support hash tables because there is no assignment operator. This can be added backwards compatibly.

# Alternatives

The impact of not doing this is that the `[]` notation will not be available to `Vec`.

# Unresolved questions

None that I'm aware of.

0 comments on commit c9c0fdb

Please sign in to comment.