Hello
Sorry for the mail being sent off-list. Here's what I suggested in case it 
helps somebody else:

   match opt_err {
        None => format!("compilation failed at offset {:u}", 0u),
        Some(ref s) => format!("compilation failed at offset {:u}: {:s}", 0u, 
s.as_slice())
    };

Le 12 nov. 2013 à 14:58, Cadence Marseille <[email protected]> a écrit 
:

> Thank you, Micah.  Your suggestion and Léo Testard's suggestion using 
> s.as_slice() (emailed off-list) work well.
> 
> Cadence
> 
> 
> On Tue, Nov 12, 2013 at 8:01 AM, Micah Chalmer <[email protected]> wrote:
> 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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to