This will work for your pattern match without cloning:
match self.opt_err {
None => format!("compilation failed at offset {:u}", self.erroffset
as uint),
Some(ref s) => format!("compilation failed at offset {:u}: {:s}",
self.erroffset as uint, *s)
}
It takes a reference to the string instead of moving it. You end up with a
pointer to a pointer (&~) which is why you have to explicitly dereference it
when you use it.
-Micah
On Nov 12, 2013, at 7:41 AM, Cadence Marseille <[email protected]>
wrote:
> 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()) 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
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev