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
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
