Rémi (cc'ing Philipp and rust-dev list)-

We track bugs, work-items, and (some) feature requests here:

  https://github.com/mozilla/rust/issues

Cheers,
-Felix

On 25/06/2013 12:18, Rémi Fontan wrote:
good to know. should I be reporting the bug to some sort of bug-report-system?

Rémi


On Mon, Jun 24, 2013 at 11:48 PM, Philipp Brüschweiler <[email protected] <mailto:[email protected]>> wrote:

    Hi Rémi,

    Yes, this looks like a compiler bug to me.

    Cheers,
    Philipp


    On Mon, Jun 24, 2013 at 1:07 PM, Rémi Fontan <[email protected]
    <mailto:[email protected]>> wrote:

        I have another example that puzzles me.

        struct Vec { x:float, y:float, z:float }
        impl Vec {
            pub fn getRef<'a>(&'a mut self, i:uint) -> &'a mut float {
                // if(i==0) { &mut self.x }
                // else if(i==1) { &mut self.x }
                // else {&mut self.x }
                match(i) {
                    0 => &mut self.x,
                    1 => &mut self.y,
                    _ => &mut self.z
                }
            }
        }

        when compiling with match I get following errors :

        rustc test.rs <http://test.rs> -o test-test --test
        test.rs:122:17: 122:28 error: cannot infer an appropriate
        lifetime due to conflicting requirements
        test.rs:122 <http://test.rs:122>     _ => &mut self.z
         ^~~~~~~~~~~
        test.rs:121:17: 121:28 note: first, the lifetime must be
        contained by the expression at 121:17...
        test.rs:121 <http://test.rs:121>     1 => &mut self.y,
         ^~~~~~~~~~~
        test.rs:121:17: 121:28 note: ...due to the following expression
        test.rs:121 <http://test.rs:121>     1 => &mut self.y,
                                     ^~~~~~~~~~~
        test.rs:120:17: 120:28 note: but, the lifetime must also be
        contained by the expression at 120:17...
        test.rs:120 <http://test.rs:120>     0 => &mut self.x,
         ^~~~~~~~~~~
        test.rs:120:17: 120:28 note: ...due to the following expression
        test.rs:120 <http://test.rs:120>     0 => &mut self.x,
                                     ^~~~~~~~~~~
        error: aborting due to previous error
        make: *** [test-test] Error 101



        but it compiles correctly with the if version. I don't
        understand why it's not behaving the same way. Actually I
        don't understand why the compiler is not capable of finding
        out about the life cycle on its own for this particular
        example. Could the life cycle of the return type of getRef be
        inferred from the lifecycle of  the intersection of {self.x,
        self.y, self.z} ?

        cheers,

        Rémi




        On Mon, Jun 24, 2013 at 2:32 AM, Philipp Brüschweiler
        <[email protected] <mailto:[email protected]>> wrote:

            Hi Rémi,

            Yes, the documentation of Rust is not very good at the
            moment. The concept and syntax of lifetimes is explained
            in this and the following chapter:

            
http://static.rust-lang.org/doc/tutorial-borrowed-ptr.html#returning-borrowed-pointers

            The only single quotes are only used to declare literal
            characters, e.g. 'c', and lifetime variables.

            Cheers,
            Philipp


            On Sun, Jun 23, 2013 at 12:03 PM, Rémi Fontan
            <[email protected] <mailto:[email protected]>> wrote:

                thanks, it works.

                however it is not yet very clear to me how lifetime
                works in rust. is there a bit of doc that explain
                about the concept of lifetime and the syntax?

                is using a quote before the lifetime variable
                necessary? I realised that the first time I read the
                rust tutorial I saw a lot of variables with a quote in
                front of their name, I simply ignore that details and
                went ahead. Were there all lifetime variables?

                cheers,

                Rémi


                On Sat, Jun 22, 2013 at 8:47 PM, Philipp Brüschweiler
                <[email protected] <mailto:[email protected]>> wrote:

                    Hi Rémi,

                    The problem in your code was that you have to
                    return a &mut reference. Here's a version of your
                    code that works:

                    ```

                    struct Mat {
                    data:[float, ..16]
                    }

                    impl Mat {
                        pub fn new() -> Mat {
                            Mat { data: [0.0, ..16] }
                        }
                        pub fn Get<'a>(&'a mut self, r:int, c:int) ->
                    &'a mut float {
                    &mut self.data[r+c*4]
                        }
                    }

                    fn main() {
                        let mut a = Mat::new();
                        *a.Get(0, 0) = 5.0;
                    println(fmt!("%?", a));
                    }
                    ```

                    Note that besides taking an &mut reference, we
                    have to tell the compiler that the lifetime of
                    that reference is the same as of the original
                    object, which is done by anotating both references
                    with the same lifetime variable ('a in this code).

                    Cheers,
                    Philipp


                    On Sat, Jun 22, 2013 at 10:35 AM, Rémi Fontan
                    <[email protected] <mailto:[email protected]>>
                    wrote:

                        Hi,

                        is there a way to write something as follow in
                        rust?

                        class matrix {
                        ...
                        float& Get(int r, int c)    { return
                        this.data[r + c*4]; }
                        }

                        matrix m;
                        m.Get(0, 1) = 42.;


                        in trust, my struct matrix would have a method
                        called Get, but what would it return?

                        struct Mat {
                        data:[float, ..16]
                        }

                        impl Mat  {
                            pub fn Get(&mut self, r:int, c:int) ->
                        &mut float {
                        &self.data[r+c*4]
                            }
                        }


                        I get error messages about lifetime or about
                        mutability

                        est.rs:107:8: 107:24 error: mismatched types:
                        expected `&mut float` but found `&float`
                        (values differ in mutability)
                        test.rs:107 <http://test.rs:107> &self.data[r*4+c]
                        ^~~~~~~~~~~~~~~~


                        cheers,

                        Remi
-- Rémi Fontan : [email protected]
                        <mailto:[email protected]>
                        mobile: +64 21 855 351
                        <tel:%2B64%2021%20855%20351>
                        93 Otaki Street, Miramar 6022
                        Wellington, New Zealand

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





-- Rémi Fontan : [email protected]
                <mailto:[email protected]>
                mobile: +64 21 855 351 <tel:%2B64%2021%20855%20351>
                93 Otaki Street, Miramar 6022
                Wellington, New Zealand





-- Rémi Fontan : [email protected] <mailto:[email protected]>
        mobile: +64 21 855 351 <tel:%2B64%2021%20855%20351>
        93 Otaki Street, Miramar 6022
        Wellington, New Zealand





--
Rémi Fontan : [email protected] <mailto:[email protected]>
mobile: +64 21 855 351
93 Otaki Street, Miramar 6022
Wellington, New Zealand


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


--
irc: pnkfelix on irc.mozilla.org
email: {fklock, pnkfelix}@mozilla.com

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

Reply via email to