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

Reply via email to