1

gtk エントリで Enter キーが押されたときに、Diesel を使用してデータベースからオブジェクトを取得しようとしています。私の考えは、メイン関数で Diesel SQLite 接続を作成し、必要になるたびにそれを借りることです。

そのために、非常に単純な MVC を使用しようとしています。アイデアは、接続をすべてのコントローラーに渡し、それを再利用することです。ここでは生涯が必要であることを知っています。

pub struct Controller<'a> {
    pub connection: &'a SQLiteConnection,
    pub search_entry: SearchEntry,
    ....
}

impl<'a> Controller<'a> {

    pub fn new(conn: &'a SQLiteConnection) -> Self {
        Self {
            search_entry: SearchEntry::new(),
            connection: conn,
            ....
        }
    }

    pub fn init(&self) {
        self.search_entry.connect_activate(|x| {
            let need_it = diesel_table
            .filter(column_id.eq(&x.get_text().unwrap()))
            .first(self.connection)
            .unwrap();
        });
    }
}

コンパイルすると、次のようになります。

error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
  --> src/lib.rs:44:44
   |
44 |           self.search_entry.connect_activate(|x| {
   |  ____________________________________________^
45 | |             let need_it = diesel_table
46 | |                 .filter(column_id.eq(&x.get_text().unwrap()))
47 | |                 .first(self.connection)
48 | |                 .unwrap();
49 | |         });
   | |_________^
   |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 43:5...
  --> src/lib.rs:43:5
   |
43 | /     pub fn init(&self) {
44 | |         let need_it = diesel_table
46 | |                 .filter(column_id.eq(&x.get_text().unwrap()))
47 | |                 .first(self.connection)
48 | |                 .unwrap();
49 | |         });
50 | |     }
   | |_____^
note: ...so that the types are compatible
  --> src/lib.rs:44:44
   |
44 |           self.search_entry.connect_activate(|x| {
   |  ____________________________________________^
45 | |             let need_it = diesel_table
46 | |                 .filter(column_id.eq(&x.get_text().unwrap()))
47 | |                 .first(self.connection)
48 | |                 .unwrap();
49 | |         });
   | |_________^
   = note: expected  `&&Controller<'_>`
              found  `&&Controller<'a>`
   = note: but, the lifetime must be valid for the static lifetime...
note: ...so that the type `[closure@src/lib.rs:44:44: 49:10 self:&&Controller<'_>]` will meet its required lifetime bounds
  --> src/lib.rs:44:27
   |
44 |         self.search_entry.connect_activate(|x| {
   |                           ^^^^^^^^^^^^^^^^

このエラーは、関数connect_activateに静的パラメーターがあるためです: fn connect_activate<F: Fn(&Self) + 'static>

接続を返す関数を使用して、ユーザーが Intro キーを押すたびに接続を初期化したくありません。代わりにそのつながりを借りたいと思います。

それを行う最も効率的な方法は何ですか?

どうもありがとうございます。すべてを理解していただければ幸いです。

4

2 に答える 2

1

私はあなたが必要だと思いますRc<SQLiteConnection>

于 2020-04-23T12:26:55.663 に答える