¿Cómo almacenar objetos de conexión y declaración rusqlite en la misma estructura en Rust? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
¿Por qué no puedo almacenar un valor y una referencia a ese valor en la misma estructura? 2 respuestasEstoy trabajando en mi primer programa Rust y me he encontrado con la semántica de propiedad de Rust. He declarado unstruct
que encapsulará una conexión de base de datos SQLite para que mantenga unConnection
miembro. Por razones de rendimiento, también quiero mantener una declaración preparada, representada por elStatement
tipo. Aquí hay una versión simplificada de mi código:
extern crate rusqlite; // 0.14.0
use rusqlite::{Connection, Statement};
pub struct Foo<'a> {
conn: Connection,
statement: Statement<'a>,
}
impl<'a> Foo<'a> {
pub fn new() -> Foo<'a> {
let conn = Connection::open(&":memory:").unwrap();
let statement = conn
.prepare("INSERT INTO Foo(name, hash) VALUES($1, $2)")
.unwrap();
Foo { conn, statement }
}
}
Estoy tratando de transferir la propiedad deconn
variable a la persona que llama almacenándola en un miembro deFoo
, pero cuando intento compilar este código falla:
error[E0597]: `conn` does not live long enough
--> src/main.rs:13:25
|
13 | let statement = conn
| ^^^^ borrowed value does not live long enough
...
17 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 10:6...
--> src/main.rs:10:6
|
10 | impl<'a> Foo<'a> {
| ^^
Por alguna razón, elrusqlite::Connection
type no toma un parámetro de por vida, por lo que no puedo vincular explícitamente su vida útil a la delStatement
ejemplo.
¿Qué me estoy perdiendo? Este tipo de encapsulación es un patrón muy común, estoy seguro de que me falta algo.