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]> 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 -o test-test --test > test.rs:122:17: 122:28 error: cannot infer an appropriate lifetime due to > conflicting requirements > 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 1 => &mut self.y, > ^~~~~~~~~~~ > test.rs:121:17: 121:28 note: ...due to the following expression > 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 0 => &mut self.x, > ^~~~~~~~~~~ > test.rs:120:17: 120:28 note: ...due to the following expression > 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]>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]>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]>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]>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 &self.data[r*4+c] >>>>> ^~~~~~~~~~~~~~~~ >>>>> >>>>> >>>>> cheers, >>>>> >>>>> Remi >>>>> -- >>>>> Rémi Fontan : [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 >>>>> >>>>> >>>> >>> >>> >>> -- >>> Rémi Fontan : [email protected] >>> mobile: +64 21 855 351 >>> 93 Otaki Street, Miramar 6022 >>> Wellington, New Zealand >>> >> >> > > > -- > Rémi Fontan : [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
