0

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を渡すことは可能ですか? はいの場合、どのように?

4

1 に答える 1