gpt4 book ai didi

reference - 是否可以在不使用类型参数的情况下将 Arc> 传递给函数?

转载 作者:行者123 更新时间:2023-11-29 08:26:56 25 4
gpt4 key购买 nike

<分区>

我必须通过 Arc<RwLock<&Fn()>>一个函数:

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)()
}

Rust Playground

编译失败并显示错误信息:

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() )。这仅在您删除 execute() 的函数签名中的一个符号时有效。 ,但这并没有真正帮助我,因为我不想在这里解释的原因,我需要那些包装器。 Rust Playground
  • 移动 Fn()execute()函数签名到 where 子句中:

    fn execute(f: Arc<RwLock<&F>>) where F: Fn() { /* ... */ }

    这也行,但是我也不能使用 where 子句(因为我在结构中需要它,但在结构中没有 where 子句)。

  • 结合前面两个想法:传递 Arc<RwLock<&&Fn()>>并删除函数签名中的一个符号。那将是我需要的,但它也失败了。
  • 选角 wrapped_closure进入 Arc<RwLock<&Fn()>> (这是类似问题的解决方案 here )。这失败了,因为它是一个“非原始类型转换”

是否可以传递 Arc<RwLock<&Fn()>>在 Rust 中不添加类型参数和 where 子句?如果是,如何?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com