这里的系统是:
- event:针对不同类型的事件“扩展”的trait
- window:控制器,负责创建窗口并将其事件进一步传播到队列中
- 应用范围:整个应用程序的控制器,它创建一个窗口并进行其他操作(现在不重要)。
窗口和应用程序对象必须与程序存在的时间一样长,因为它们本身就是程序。
我需要能够创建一个回调函数(一个闭包或一个方法),并通过“set_event_callback”方法将其传递给窗口结构体,以便在事件发生时调用处理程序。
然而,我面临着一个生命周期的问题,因为下面的代码不会编译错误:
error[E0521]: borrowed data escapes outside of method
--> src/main.rs:34:9
|
31 | pub fn run(&mut self) {
| ---------
| |
| `self` is a reference that is only valid in the method body
| let's call the lifetime of this reference `'1`
...
34 | / window.set_event_callback(|event| {
35 | | self.data += 1;
36 | | false
37 | | });
| | ^
| | |
| |__________`self` escapes the method body here
| argument requires that `'1` must outlive `'static`
个字符
我怀疑这可能是因为编译器不知道window
和application
对象的生存期。但我在一周内没有找到解决方案。
**注意:**在run
方法(pub fn run(&'static self))
中将'static
添加到&self
会导致另一个错误:
error[E0716]: temporary value dropped while borrowed
--> src/main.rs:42:5
|
42 | Application::new().run();
| ^^^^^^^^^^^^^^^^^^------
| |
| creates a temporary value which is freed while still in use
| argument requires that borrow lasts for `'static`
43 | }
| - temporary value is freed at the end of this statement
型
2条答案
按热度按时间klsxnrf11#
我已经修复了你的代码,只是添加了显式的生存期注解。
我已经向编译器保证,
callback
的生存时间不会超过它所使用的application
的唯一引用。字符串
但是请记住,一般情况下要避免使用Rust生命周期。它只是更温和的 *C++指针恶魔 * 的化身,处理起来更安全。
然而,它们往往很难写。很少有用例是解决问题的最佳工具。
qcbq4gxm2#
我有第二个解决方案。这一个抽象的一生了。
小开销是:
字符串