HashMap
を使用してインメモリデータベースを作成しようとしています。私は、構造体Person
持っている:メモリデータベース設計で
struct Person {
id: i64,
name: String
}
impl Person {
pub fn new(id: i64, name: &str) -> Person {
Person { id: id, name: name.to_string() }
}
pub fn set_name(&mut self, name: &str) {
self.name = name.to_string();
}
}
をそして私は、構造体Database
持っている:このデータベースを使用するように
use std::sync::Arc;
use std::sync::Mutex;
use std::collections::HashMap;
struct Database {
db: Arc<Mutex<HashMap<i64, Person>>> // access from different threads
}
impl Database {
pub fn new() -> Database {
db: HashMap::new()
}
pub fn add_person(&mut self, id: i64, person: Person) {
self.spots.lock().unwrap().insert(id, person);
}
pub fn get_person(&self, id: i64) -> Optional<&mut Person> {
self.spots.lock().unwrap().get_mut(&id)
}
}
とコードを:
let mut db = Database::new();
db.add_person(1, Person::new(1, "Bob"));
私は人の名前を変更したい:
let mut person = db.get_person(1).unwrap();
person.set_name("Bill");
complete code in the Rust playground。
コンパイルすると、私は錆寿命の問題を取得する:
error: borrowed value does not live long enough
--> <anon>:34:9
|
34 | self.db.lock().unwrap().get_mut(&id)
| ^^^^^^^^^^^^^^^^^^^^^^^ temporary value created here
35 | }
| - temporary value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 33:61...
--> <anon>:33:62
|
33 | pub fn get_person(&self, id: i64) -> Option<&mut Person> {
| ^
どのようにこのアプローチを実装するために?