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

Reply via email to