The errors you are seeing now are in fact related to borrowing @T values, as suggested in a previous message. In this case, your problem is that you need to have values with the same lifetime as the this pointer, but the default match construct copies value out. This means that the lifetime of the copied-out values is limited to the current stack frame. You can address this using `ref` mode. Unfortunately, due to the bug with lifetime inference cited earlier, you will need to provide explicit hints to help the type checker out. Hopefully this will be fixed soon.

In any case, I've made the requisite changes here:

https://github.com/nikomatsakis/rustled/commit/aea45eeeea2b328f5f3c6515de21be2039a9498d

and opened a pull request:

https://github.com/stevej/rustled/pull/1


regards,
Niko


Steve Jenson wrote:
On Thu, Dec 27, 2012 at 3:16 PM, Niko Matsakis <[email protected] <mailto:[email protected]>> wrote:

    I'm sorry for not replying more quickly, I was not checking e-mail
    over xmas break.  I do not know of any general problems with @ and
    borrowing.  In any event, this is a misdiagnosis.


No problem with reply timing.

    The problem is this: the declaration of iter looks like this:

        impl<K: Copy Eq Ord, V: Copy> RBMap<K, V>: iter::BaseIter<(&K,
    &V)>

    In the context of a type declaration, an & means `&self`, where
    `self` is the lifetime parameter associated with the
    type/impl/whatever (just as the impl has two type parameters K and
    V, it also has an implicit lifetime parameter `self`).  So, this
    declaration written out more explicitly would be:

    impl<K: Copy Eq Ord, V: Copy> RBMap<K, V>:
    iter::BaseIter<(&self/K, &self/V)>

    However, your method declaration is:

        pure fn each(&self, f: fn(&(&K, &V)) -> bool) { ... }

    In the context of a function declaration, & means "a fresh
    lifetime".  So this winds up being short for a declaration life this:

        pure fn each(&self, f: fn(&a/(&a/K, &a/V)) -> bool) { ... }

    However, the trait declares that `each` should have this type:

        pure fn each(&self, f: fn(&a/(&self/K, &self/V)) -> bool) { ... }

    So I think that if you change your declaraiton of `each()` to:

        pure fn each(&self, f: fn(&(&self/K, &self/V)) -> bool) { ... }

    It will work just fine.  I apologize for the cryptic error
    message.  Working on it.


Unfortunately not but a much more interesting set of error messages about lifetimes is coming out now: http://pastebin.com/SYwCw1ac

And here is a link to the each method again (I pushed this broken version to github so I can share the exact changes I made)

https://github.com/stevej/rustled/blob/master/red_black_tree.rs#L96

Thanks a bunch for all of your clarifying comments and blog posts.

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

Reply via email to