【发布时间】:2019-07-30 20:37:55
【问题描述】:
在 Python 或 C++ 中,类say A 可以将一些工作委托给类 Say B 的另一个实例,并在 B 中设置 A 的回调方法。 我尝试在 Rust 中做到这一点,但到目前为止我一无所获,被 Rust 编译器击败。
这是我尝试过的代码,其余代码在本文末尾。
在 A::test 中,我尝试使用闭包来获取 Fn() 特征对象作为回调。
// let b = B::new(self.finish)); // ideally but would not compile
// let test :Box<Fn(String)> = Box::new(move |msg| {self.finish(msg);}); // cannot infer an appropriate lifetime due to conflicting requirements
// let b = B::new(&test);
// let b = B::new(&Box::new( |msg| {A::finish(&self, msg);} )); // expected trait std::ops::Fn, found closure
// let b = B::new(&Box::new( |msg| {self.finish(msg);} )); // expected trait std::ops::Fn, found closure
还没有任何工作。有没有办法做到这一点?
任何帮助将不胜感激!
还是我根本上错了? Rust 是否要求另一种方式来实现这个想法?
这是我的测试代码
struct A {}
impl A {
fn finish(&self, msg: String) {
println!("{}", msg);
}
fn test(&self) {
//let b = B::new(self.finish)); // would not compile
// let test :Box<Fn(String)> = Box::new(move |msg| {self.finish(msg);}); // cannot infer an appropriate lifetime due to conflicting requirements
// let b = B::new(&test);
// let b = B::new(&Box::new( |msg| {A::finish(&self, msg);} )); // expected trait std::ops::Fn, found closure
let b = B::new(&Box::new( |msg| {self.finish(msg);} )); // expected trait std::ops::Fn, found closure
b.start("hi".to_string().clone());
}
}
struct B<'b> {
// cb:fn(msg:String),
cb: &'b Box<Fn(String)>,
}
impl<'b> B<'b> {
fn new(cb: &'b Box<Fn(String)>) -> B<'b> {
B { cb: cb }
}
fn start(&self, msg: String) {
(self.cb)(msg);
}
}
fn main() {
let a = A {};
a.test();
}
【问题讨论】:
-
为什么所有的代码都被注释掉了?请不要那样做!另外,请在操场右上角使用
rustfmt,或在您的机器上使用cargo fmt。 -
@hellow 感谢您的建议。我是 Rust 的新手,不知道。游乐场是个绝妙的主意。