Мне нужно передать 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)()
}
Компиляция завершается с ошибкой:
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 Перемещение
Fn()
в сигнатуре функцииexecute()
в предложение where:fn execute(f: Arc<RwLock<&F>>) where F: Fn() { /* ... */ }
Это тоже работает, но я также не могу использовать предложение where (потому что оно мне понадобится в структуре, а в структурах нет предложений where).
- Объединение двух предыдущих идей: передача
Arc<RwLock<&&Fn()>>
и удаление одного амперсанда в сигнатуре функции. Это было бы то, что мне нужно, но это также не удается. - Приведение
wrapped_closure
кArc<RwLock<&Fn()>>
(это было решением аналогичной проблемы здесь). Это не удается, поскольку это «непримитивный состав».
Можно ли передать Arc<RwLock<&Fn()>>
в Rust без добавления параметра типа и предложения where? Если да, то как?
Box::new(&closure as &Fn())
. Если вы не согласны, измените свой вопрос, чтобы объяснить различия. В противном случае мы можем пометить этот вопрос как уже отвеченный. - person Shepmaster   schedule 19.06.2018&closure as &Fn()
, а не весь тип. - person Shepmaster   schedule 19.06.2018<F>
была случайной ошибкой, а не частью проблемы, поэтому я удалил ее и отредактировал заголовок, чтобы лучше понять проблему, поскольку я действительно не думаю, что она вообще касается пунктовwhere
. Если вы не считаете, что мои правки соответствуют духу исходного вопроса, пожалуйста, отредактируйте его обратно. - person trentcl   schedule 20.06.2018