diff --git a/src/libcollections/slice.rs b/src/libcollections/slice.rs index 865da9eff136a..ff00ca58e8c76 100644 --- a/src/libcollections/slice.rs +++ b/src/libcollections/slice.rs @@ -2034,6 +2034,16 @@ mod tests { assert!(xs == [1,2,0,4,3,0,0,6,5,0]); } + #[test] + fn test_get_mut() { + let mut v = [0,1,2]; + assert_eq!(v.get_mut(3), None); + v.get_mut(1).map(|e| *e = 7); + assert_eq!(v[1], 7); + let mut x = 2; + assert_eq!(v.get_mut(2), Some(&mut x)); + } + #[test] fn test_mut_chunks() { let mut v = [0u8, 1, 2, 3, 4, 5, 6]; diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index d579d04489240..bb24d53458c24 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -717,6 +717,9 @@ impl<'a, T: Ord> ImmutableOrdVector for &'a [T] { /// Extension methods for vectors such that their elements are /// mutable. pub trait MutableVector<'a, T> { + /// Returns a mutable reference to the element at the given index, + /// or `None` if the index is out of bounds + fn get_mut(self, index: uint) -> Option<&'a mut T>; /// Work with `self` as a mut slice. /// Primarily intended for getting a &mut [T] from a [T, ..N]. fn as_mut_slice(self) -> &'a mut [T]; @@ -920,6 +923,11 @@ pub trait MutableVector<'a, T> { } impl<'a,T> MutableVector<'a, T> for &'a mut [T] { + #[inline] + fn get_mut(self, index: uint) -> Option<&'a mut T> { + if index < self.len() { Some(&mut self[index]) } else { None } + } + #[inline] fn as_mut_slice(self) -> &'a mut [T] { self }