Hi All,
sorry for my late replay, i am UTC+2
> Won't wrapping the first `for` loop into curly braces help?
no
> is this a database library you're writing yourself?
yes
> My best guess here is that you've accidentally used the wrong lifetime on
> your `execute_query()` method, tying the lifetime of the `self` reference
to
> a lifetime on the value itself
yes, but removing the lifetime reference on the self, compiling my library
gives
sql\connection.rs:57:2: 64:3 note: consider using an explicit lifetime
parameter as shown: fn execute_query(&'a mut self) -> ResultSet<'a>
sql\connection.rs:57 pub fn execute_query(&mut self) -> ResultSet<'a> {
sql\connection.rs:58 match self.pCon.dbType {
sql\connection.rs:59 SQLITE3 => {
sql\connection.rs:60 if self.exec { unsafe {
sqlite3_reset(self.pStmt) }; } else {self.exec=true; }
sql\connection.rs:61 ResultSet { pStmt : self, error : false }
sql\connection.rs:62 }
...
sql\connection.rs:61:23: 61:27 error: cannot infer an appropriate lifetime
for automatic coercion due to conflicting requirements
sql\connection.rs:61 ResultSet { pStmt : self, error : false }
^~~~
execute_query can be used only for the loop body, and if there is no
variable referencing it there is no reason for the execute-query to live
outside the loop (as is my example)
or, with code like this :
let query_result = st.execute_query()
for i in query_result {
...
and in this case, the query_result lives outside the loop
the compiler can not distinguish these two usages ?
Thanks
2014-05-30 9:17 GMT+02:00 Kevin Ballard <[email protected]>:
> On May 30, 2014, at 12:12 AM, Vladimir Matveev <[email protected]>
> wrote:
>
> > 2014-05-30 5:37 GMT+04:00 Kevin Ballard <[email protected]>:
> >>
> >> It shouldn't.
> >>
> >> The for-loop desugaring looks like
> >>
> >> match &mut st.execute_query() {
> >> __i => loop {
> >> match __i.next() {
> >> None => break,
> >> Some(mut __value) => {
> >> let i = __value;
> >> {
> >> // for loop body goes here
> >> }
> >> }
> >> }
> >> }
> >> }
> >>
> >> It's done with a match statement like this specifically to make the
> &mut binding of the iterator end after the for loop.
> >
> > Great, didn't know it. Last time I asked (on StackOverflow, I think;
> > that was some time ago though) there were no `match`. Then from that
> > code alone it does look like a bug to me. Note that it refers to
> > `st.set_string("%e%")` and `for` loop ten lines above, that is, the
> > first one. If mutable borrow of the iterator aren't escaping the loop,
> > then this error should not appear, right?
>
> The errors you printed are slightly malformed, and you only listed some of
> your code. Is this a database library you're writing yourself? My best
> guess here is that you've accidentally used the wrong lifetime on your
> `execute_query()` method, tying the lifetime of the `self` reference to a
> lifetime on the value itself. Something like this:
>
> impl<'a> Statement<'a> {
> pub fn execute_query(&'a mut self) { ... }
> }
>
> By using 'a on &'a mut self here, you've explicitly tied the reference to
> the lifetime of the value. This causes the mutable reference to live much
> longer than you expected it to, which means it's still alive when you try
> to subsequently borrow it on your call to .set_string().
>
> -Kevin
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev