在 Rust 中别名闭包类型,但编译器要求生命周期说明符



我是 Rust 甚至这些接触裸机的语言的新手。

我打算为一个闭包类型添加别名,该类型将几个指针作为参数,并返回一个 String。使用最新的语法(如果我理解正确的话(,我写道:

pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;

编译器要求我为每个指针参数添加生存期说明符:

src/helpers.rs:24:26: 24:49 error: missing lifetime specifier [E0106]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                           ^~~~~~~~~~~~~~~~~~~~~~~
src/helpers.rs:24:43: 24:48 error: missing lifetime specifier [E0106]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                            ^~~~~
src/helpers.rs:24:44: 24:48 error: explicit lifetime bound required
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                             ^~~~
src/helpers.rs:24:51: 24:58 error: missing lifetime specifier [E0106]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                                    ^~~~~~~
src/helpers.rs:24:60: 24:69 error: missing lifetime specifier [E0106]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                                             ^~~~~~~~~
src/helpers.rs:24:61: 24:69 error: wrong number of lifetime parameters: expected 1, found 0 [E0107]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                                              ^~~~~~~~
src/helpers.rs:24:71: 24:89 error: missing lifetime specifier [E0106]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                                                        ^~~~~~~~~~~~~~~~~~
src/helpers.rs:24:76: 24:89 error: wrong number of lifetime parameters: expected 1, found 0 [E0107]
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                                                                             ^~~~~~~~~~~~~
src/helpers.rs:24:22: 24:99 error: explicit lifetime bound required
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>;
                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 9 previous errors

我应该说我对这里的终身说明符完全感到困惑。我可以通过仅使用此函数定义自定义特征来实现相同的功能,并且编译器不会以这种方式要求这些指针的生命周期。但我认为从 API 级别来看,使用共享闭包应该更漂亮。

在全局级别,没有类型推断;所有的东西都必须显式写出来,除了函数定义的生命周期省略规则(即如何编写类似fn x(&self) -> &Foo的东西,而不是需要编写fn x<'a>(&'a self) -> &'a Foo(。

在这种情况下,这很重要,因为Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>不是完整的混凝土类型。它有两个问题:

  1. Fn是一种特征,而不是具体的类型; 你需要要么装箱你的未装箱闭包(Box<Fn<…, …>>,可以顺便写Box<Fn(…) -> …>(,要么在必要时到处使用泛型;

  2. 你缺少很多一生。

忽略第一点,让我们只担心第二点。你实际需要写的是这样的内容:

pub type HelperDef<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h> =
    Fn(&'a HashMap<String, &'b Show>, &'c Helper, &'d Registry<'e>,
       &'f mut RenderContext<'g>) -> String + 'h;

其中大多数应该是有意义的,但'h+ 'h可能没有那么多:这是因为Fn是一个特征;为了形成特征的别名(这将是一个未调整大小的类型 - 动态大小类型是一个很长的故事,我不会在这里尝试解释(,必须明确生命周期限制(这是最后一个错误的主题(。

最新更新