cargo
- cargo 1.56.0-nightly
以下のようなことを実現したい
- シングルスレッド
- Sampleは作るのが大変なオブジェクト
- Sampleの可変参照をとってメソッドを呼びたい。
- MAP:CacheMapはthread_localなキャッシュ、ここに一度作ったSampleをキャッシュしておきたい
- MAPから所有権を取ることはない。sampleメソッドが呼べればいい。
現状書いていてだめなソースコード
rust
1use std::collections::hash::map::HashMap; 2struct Sample { 3 n:usize, 4} 5impl Sample { 6 fn new(n:usize)->Self{ /*Heavy constructer*/ Sample{ n } } 7 fn sample(&mut self){ 8 self.n += 1; 9 } 10} 11struct CacheMap(HashMap<usize,Sample>);/*ココらへんの型がわからない*/ 12impl CacheMap { 13 fn new() -> Self { CacheMap(HashMap::new()) } 14 fn get(&mut self,n:usize) -> Cell<&mut Sample>/*ココらへんの型がわからない*/ { 15 let item = self.0.get_mut(&n); 16 if let Option::Some(s)=item { return Cell::new(s); } 17 let s = Box::new(Sample::new(n)); 18 self.0.insert(n, *s); 19 self.get(n) 20 } 21} 22thread_local!{ 23 static MAP: RefCell<CacheMap>/*ココらへんの型がわからない*/ = RefCell::new(CacheMap::new()); 24} 25fn main() { 26 MAP.with(|m|{ 27 let m = m.borrow_mut(); 28 let c = m.get(4); 29 c.get_mut().sample(); 30 }); 31} 32
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/10 16:56 編集