diff --git a/src/libcore/option.rs b/src/libcore/option.rs index d41dbb11adb..5ae1060dd29 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -150,6 +150,7 @@ use mem; use result::{Result, Ok, Err}; use slice; use slice::AsSlice; +use clone::Clone; // 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 @@ -676,6 +677,14 @@ impl Option { } } +impl<'a, T: Clone> Option<&'a T> { + /// Maps an Option<&T> to an Option by cloning the contents of the Option<&T>. + #[unstable = "recently added as part of collections reform"] + pub fn cloned(self) -> Option { + self.map(|t| t.clone()) + } +} + impl Option { /// Returns the contained value or a default /// diff --git a/src/libcoretest/option.rs b/src/libcoretest/option.rs index 18444fc4240..6138986e1d1 100644 --- a/src/libcoretest/option.rs +++ b/src/libcoretest/option.rs @@ -11,6 +11,7 @@ use core::option::*; use core::kinds::marker; use core::mem; +use core::clone::Clone; #[test] fn test_get_ptr() { @@ -239,3 +240,15 @@ fn test_collect() { assert!(v == None); } + +fn test_cloned() { + let s = 1u32; + let n: Option<&'static u32> = None; + let o = Some(&s); + + assert_eq!(o.clone(), Some(&s)); + assert_eq!(o.cloned(), Some(1u32)); + + assert_eq!(n.clone(), None); + assert_eq!(n.cloned(), None); +} \ No newline at end of file