Home > OS >  executing method on variable pointer moves the variable itself?
executing method on variable pointer moves the variable itself?

Time:08-02

I'm using the rusqlite crate and am doing some queries, basically i'm just trying to check the length of the query results before trying to proceed, however I'm running into error[E0382]: use of moved value: key_rows whilst trying to compile, I don't understand since i'm borrowing a reference to the variable so it wouldn't move it's local in memory?

Maybe it's due to the method i'm calling on the variable's pointer?

Full compiler error:

error[E0382]: use of moved value: `key_rows`
   --> src/handle.rs:126:16
    |
108 |     let key_rows = key_stmt.query_map(&[(":key", key.as_str())], |row| {
    |         -------- move occurs because `key_rows` has type `MappedRows<'_, [closure@src/handle.rs:108:66: 113:6]>`, which does not implement the `Copy` trait
...
117 |     if(&key_rows.count() == &0){
    |                  ------- `key_rows` moved due to this method call
...
126 |     for row in key_rows {
    |                ^^^^^^^^ value used here after move
    |
note: this function takes ownership of the receiver `self`, which moves `key_rows`

Erroneous code:

    let mut key_stmt = conn.prepare("SELECT id , key FROM key_table WHERE key = :key;").unwrap();
    
    let key_rows = key_stmt.query_map(&[(":key", key.as_str())], |row| {
        Ok(Table {
            id: row.get(0)?,
            payload: row.get(1)?,
        })
    }).unwrap();

    //Checking that the key exists:

    if(&key_rows.count() == &0){
        panic!("Can't find the key...")
    }
    //Putting in a default value since the compiler is worried.
    let mut reference_id : i32 = 0;

    //For loop is nessessary since MappedRow type cannot be indexed regularly (weird)
    for row in key_rows {

        reference_id = row.unwrap().id;
        println!("{:?}", reference_id.to_string());
    }

CodePudding user response:

You aren't borrowing key_rows then checking the count, but rather calling key_rows.count(), then borrowing the result.

Iterator#count consumes the entire iterator, returning how many elements were traversed.

let mut reference_id = key_rows.next().unwrap_or_else(|| panic!("Can't find the key..."));

// Remove the code past this point if you are only expecting one, or the first value.

for row in key_rows {
    reference_id = row.unwrap().id;
    println!("{:?}", reference_id.to_string());
}
  • Related