Arc<RwLock<&Fn()>>
関数に aを渡す必要があります。
use std::sync::{Arc, RwLock};
fn main() {
let closure = || println!("Hello World");
let wrapped_closure = Arc::new(RwLock::new(&closure));
execute(wrapped_closure);
}
fn execute(f: Arc<RwLock<&Fn()>>) {
let rw_lock_read_guard = f.read().unwrap();
(rw_lock_read_guard)()
}
コンパイルが失敗し、次のエラー メッセージが表示されます。
error[E0308]: mismatched types
--> src/main.rs:6:13
|
6 | execute(wrapped_closure);
| ^^^^^^^^^^^^^^^ expected trait std::ops::Fn, found closure
|
= note: expected type `std::sync::Arc<std::sync::RwLock<&std::ops::Fn()>>`
found type `std::sync::Arc<std::sync::RwLock<&[closure@src/main.rs:4:19: 4:45]>>`
閉鎖はありませんFn
か?
私が試してみました:
- を参照に置き換え
Arc<RwLock>
ます (結果は&&Fn()
)。これは、 の関数シグネチャでアンパサンドを 1 つ削除した場合にのみ機能しますがexecute()
、これはあまり役に立ちません。ここで説明したくない理由から、これらのラッパーが必要だからです。さびの遊び場 関数シグネチャの を where 句に移動し
Fn()
ます。execute()
fn execute(f: Arc<RwLock<&F>>) where F: Fn() { /* ... */ }
それも機能しますが、where句も使用できません(構造体で必要になるためですが、構造体にはwhere句がないためです)。
- 前の 2 つのアイデアを組み合わせる:
Arc<RwLock<&&Fn()>>
関数シグネチャで a を渡し、アンパサンドを 1 つ削除します。それは私が必要とするものですが、それも失敗します。 wrapped_closure
へのキャスト(これは、ここArc<RwLock<&Fn()>>
で同様の問題に対する解決策でした)。これは「非プリミティブ キャスト」であるため失敗します。
Arc<RwLock<&Fn()>>
型パラメーターと where 句を追加せずに in Rustを渡すことは可能ですか? はいの場合、どのように?