Hi, I was thinking about a small enhancement for Option<S> objects where S: Str that would add a utility method for returning a slice option.
There is some code in rust-pcre, https://github.com/cadencemarseille/rust-pcre/blob/d833054/src/pcre/mod.rs#L137, that I think illustrates what I am trying to achieve. I want to use pattern matching, but both of these versions fail to compile: match self.opt_err { None => format!("compilation failed at offset {:u}", self.erroffset as uint), Some(s) => format!("compilation failed at offset {:u}: {:s}", self.erroffset as uint, s) } (error: cannot move out of dereference of & pointer). Makes sense. This is fixed by clone()ing self.opt_err. match self.opt_err.clone().map(|s| s.as_slice()) { None => format!("compilation failed at offset {:u}", self.erroffset as uint), Some(s) => format!("compilation failed at offset {:u}: {:s}", self.erroffset as uint, s) } (error: borrowed value does not live long enough). Also makes sense. I want to avoid the clone(), so I thought that maybe an additional utility method is needed to return a slice option given an Option<S: Str>. I have tried this idea out with: use std::option::Option; trait OptionStr { fn as_slice<'a>(&'a self) -> Option<&'a str>; } impl<S: Str> OptionStr for Option<S> { #[inline] fn as_slice<'a>(&'a self) -> Option<&'a str> { match *self { Some(ref s) => Some(s.as_slice()), None => None } } } fn main() { let opt_str = Some(~"hello world!"); match opt_str.as_slice() { Some(s) => println(s), None => return } } I don't think that the OptionStr would need an into_owned() method (like Str.into_owned()<http://static.rust-lang.org/doc/master/std/str/trait.Str.html#tymethod.into_owned>) because that can be done with map: opt_str.map(|s| s.into_owned()). Does this sound like a good idea? I can put together a Pull Request if there is interest in this. Cadence
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
