実現したいこと
サーバ側でPostされたデータを、Postされた都度、グローバルでmutableなvectorに値を入れていき、vectorに値が一定数貯まったら別の処理を行います。グローバルなvectorに値を入れる際に、既にvectorに入っている値と部分一致した場合は、vectorに値を入れないという処理を実装したいです。
発生している問題・分からないこと
once_cellを使用して以下のように実装したのですが、部分一致(ここでは、family, first, ageが一致)を判定するために、let mut binding = VECT.lock().unwrap(); とする(所有権の移転?)と、再度vectorに値を入れようと VECT.lock().unwrap().push(n4.clone()); としても、何も反応しません。
ターミナル上では、止まったままになります。
Finished dev
profile [unoptimized + debuginfo] target(s) in 0.22s
Running target/debug/sample
binding.push(n4.clone());の場合は上手くいくのですが、それだと、グローバルなベクターに値が入りません。
グローバルでmutableなvector / once_cell 参考サイト
https://stackoverflow.com/questions/27791532/how-do-i-create-a-global-mutable-singleton
上手くいく実装の方法を教えていただきたいです。
エラーメッセージ
error
1Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.22s 2 Running `target/debug/sample` 3 4↑ ここから動かない
該当のソースコード
rust
1use once_cell::sync::Lazy; 2use std::sync::Mutex; 3use std::ops::DerefMut; 4use serde::{Serialize, Deserialize}; 5 6#[derive(Debug, Serialize, Clone, Deserialize)] 7struct Name { 8 family: String, 9 first: String, 10 age: u32, 11 note: String, 12} 13 14static VECT: Lazy<Mutex<Vec<Name>>> = Lazy::new(|| Mutex::new(vec![])); 15 16fn push_name() { 17 let n1 = Name {family: "yamada".to_string(), first: "taro".to_string(), age: 20, note: "AAA".to_string()}; 18 VECT.lock().unwrap().push(n1); 19 let n2 = Name {family: "tanaka".to_string(), first: "kazuo".to_string(), age: 18, note: "BBB".to_string()}; 20 VECT.lock().unwrap().push(n2); 21 let n3 = Name {family: "sato".to_string(), first: "hanako".to_string(), age: 22, note: "CCC".to_string()}; 22 VECT.lock().unwrap().push(n3); 23} 24 25fn main(){ 26 27 push_name(); 28 let n4 = Name {family: "yoshida".to_string(), first: "kyoko".to_string(), age: 15, note: "DDD".to_string()}; 29 30 let mut binding = VECT.lock().unwrap(); 31 let objs = binding.deref_mut(); 32 33 let mut flag = 0; 34 for v in objs { 35 if n4.family == v.family { 36 if n4.first == v.first { 37 if n4.age == v.age { 38 flag = 1; 39 } 40 } 41 } 42 } 43 if flag != 1 { 44 binding.push(n4.clone()); 45 } 46}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
VECTをそのままforループで回すなど色々数時間試したのですが、上手くいきませんでした。。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/01/03 03:42
2025/01/03 03:49