error: explicit lifetime bound required
numeric(Num),
~~~
所涉及的枚举类型:
所涉及的枚举类型:
enum expr{
numeric(Num),
symbol(String),
}
我不确定这里借用的是什么。我的意图是让 Num
或 String
与包含的表达式具有相同的生命周期,以便我可以从函数中返回它们。
error: explicit lifetime bound required
numeric(Num),
~~~
所涉及的枚举类型:
enum expr{
numeric(Num),
symbol(String),
}
我不确定这里借用的是什么。我的意图是让 Num
或 String
与包含的表达式具有相同的生命周期,以便我可以从函数中返回它们。
enum Expr<N: Num> {
Numeric(N),
Symbol(String)
}
通过引用使用Trait对象:
enum Expr<'a> { // '
Numeric(&'a Num + 'a),
Symbol(String)
}
带有盒子的特性对象:
enum Expr {
Numeric(Box<Num + 'static>), // ' // I used 'static because numbers usually don't contain references inside them
Symbol(String)
}
您可以在官方指南中了解更多关于泛型和特质的信息,不过目前它缺乏有关特质对象的信息。如果您有任何疑问,请随时询问。
更新
'a
在
enum Expr<'a> { // '
Numeric(&'a Num + 'a),
Symbol(String)
}
它是一个生命周期参数。它定义了引用的生命周期和Numeric
变量内部的特质对象的生命周期。 &'a Num + 'a
是一种类型,您可以将其读作“引用后面的特质对象‘a’至少与其一样长,并且其中包含的引用也至少与其一样长”。也就是说,首先,您需要指定'a
作为引用生命周期:&'a
,其次,您需要指定特质对象内部的生命周期:Num + 'a
。后者是必需的,因为特质可以为任何类型实现,包括其中包含引用的类型,因此您需要把这些引用的最小生命周期也放入特质对象类型中,否则对于特质对象的借用检查将不能正确工作。
使用Box
时情况非常相似。Box<Num + 'static>
是“堆分配的盒子内的特质对象,其中包含的引用至少与'static
一样长”。Box
类型是堆分配的拥有数据的智能指针。因为它拥有它持有的数据,所以它不像引用那样需要生命周期参数。但是,特质对象仍然可能包含其中的引用,这就是为什么仍然使用Num + 'a
的原因;我只选择使用'static
生命周期而不是添加另一个生命周期参数。这是因为数值类型通常很简单,其中没有包含引用,而且它等价于'static
约束。当然,如果您想要,可以自由添加生命周期参数。
请注意,所有这些变体都是正确的:
&'a SomeTrait + 'a
&'a SomeTrait + 'static
Box<SomeTrait + 'a> // '
Box<SomeTrait + 'static>
'a
和 'b
是不同的生命周期参数:&'a SomeTrait + 'b
尽管这很少有用,因为'b
必须至少和'a
一样长(否则特质对象的内部可能在其自身仍然存在时被使无效),所以您可以同样使用&'a SomeTrait + 'a
。
Symbol
可能导致编译器无法推断出N
的具体类型。此外,如果最终Expr
发展成包含包含子表达式的变量,通用版本将无法扩展。我认为在一般情况下应首先考虑通用版本,但在这种情况下,我认为它不是正确的解决方案。此外,根据要求,将Numeric(N)
替换为两个变量:Integer(i64)
和Float(f64)
也足以避免装箱。 - Francis GagnéNumeric(&'a Num + 'a)
中的a
和Numeric(Box<Num + 'static>)
中的static
是做什么用的? - ragingSloth