make cloned generic over deref... and have its tests actually run
This commit is contained in:
parent
f09279395b
commit
9702fb9c7b
@ -153,6 +153,7 @@ use result::{Result, Ok, Err};
|
|||||||
use slice;
|
use slice;
|
||||||
use slice::AsSlice;
|
use slice::AsSlice;
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
|
use ops::Deref;
|
||||||
|
|
||||||
// Note that this is not a lang item per se, but it has a hidden dependency on
|
// Note that this is not a lang item per se, but it has a hidden dependency on
|
||||||
// `Iterator`, which is one. The compiler assumes that the `next` method of
|
// `Iterator`, which is one. The compiler assumes that the `next` method of
|
||||||
@ -694,11 +695,12 @@ impl<T> Option<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: Clone> Option<&'a T> {
|
impl<'a, T: Clone, D: Deref<T>> Option<D> {
|
||||||
/// Maps an Option<&T> to an Option<T> by cloning the contents of the Option<&T>.
|
/// Maps an Option<D> to an Option<T> by dereffing and cloning the contents of the Option.
|
||||||
|
/// Useful for converting an Option<&T> to an Option<T>.
|
||||||
#[unstable = "recently added as part of collections reform"]
|
#[unstable = "recently added as part of collections reform"]
|
||||||
pub fn cloned(self) -> Option<T> {
|
pub fn cloned(self) -> Option<T> {
|
||||||
self.map(|t| t.clone())
|
self.map(|t| t.deref().clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,14 +241,29 @@ fn test_collect() {
|
|||||||
assert!(v == None);
|
assert!(v == None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn test_cloned() {
|
fn test_cloned() {
|
||||||
let s = 1u32;
|
let val1 = 1u32;
|
||||||
let n: Option<&'static u32> = None;
|
let mut val2 = 2u32;
|
||||||
let o = Some(&s);
|
let val1_ref = &val1;
|
||||||
|
let opt_none: Option<&'static u32> = None;
|
||||||
|
let opt_ref = Some(&val1);
|
||||||
|
let opt_ref_ref = Some(&val1_ref);
|
||||||
|
let opt_mut_ref = Some(&mut val2);
|
||||||
|
|
||||||
assert_eq!(o.clone(), Some(&s));
|
// None works
|
||||||
assert_eq!(o.cloned(), Some(1u32));
|
assert_eq!(opt_none.clone(), None);
|
||||||
|
assert_eq!(opt_none.cloned(), None);
|
||||||
|
|
||||||
assert_eq!(n.clone(), None);
|
// Mutable refs work
|
||||||
assert_eq!(n.cloned(), None);
|
assert_eq!(opt_mut_ref.cloned(), Some(2u32));
|
||||||
|
|
||||||
|
// Immutable ref works
|
||||||
|
assert_eq!(opt_ref.clone(), Some(&val1));
|
||||||
|
assert_eq!(opt_ref.cloned(), Some(1u32));
|
||||||
|
|
||||||
|
// Double Immutable ref works
|
||||||
|
assert_eq!(opt_ref_ref.clone(), Some(&val1_ref));
|
||||||
|
assert_eq!(opt_ref_ref.clone().cloned(), Some(&val1));
|
||||||
|
assert_eq!(opt_ref_ref.cloned().cloned(), Some(1u32));
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user