我是 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>
不是完整的混凝土类型。它有两个问题:
-
Fn
是一种特征,而不是具体的类型; 你需要要么装箱你的未装箱闭包(Box<Fn<…, …>>
,可以顺便写Box<Fn(…) -> …>
(,要么在必要时到处使用泛型; -
你缺少很多一生。
忽略第一点,让我们只担心第二点。你实际需要写的是这样的内容:
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
是一个特征;为了形成特征的别名(这将是一个未调整大小的类型 - 动态大小类型是一个很长的故事,我不会在这里尝试解释(,必须明确生命周期限制(这是最后一个错误的主题(。