Enums rust中的显式生存期错误

Enums rust中的显式生存期错误,enums,rust,lifetime,object-lifetime,Enums,Rust,Lifetime,Object Lifetime,我有一个我想要使用的rust枚举,但是我收到了错误 error: explicit lifetime bound required numeric(Num), ~~~ 有关的枚举: enum expr{ numeric(Num), symbol(String), } 我想我不明白这里借了什么。我的目的是使Num或字符串与包含的expr具有相同的生存期,从而允许我从函数返回它们 这个错误消息有些误导Num是一种特性,它是一种动态大小的类型,因此如果没有某种间接方式(

我有一个我想要使用的rust枚举,但是我收到了错误

error: explicit lifetime bound required
numeric(Num),
        ~~~
有关的枚举:

enum expr{
   numeric(Num),
   symbol(String),
}

我想我不明白这里借了什么。我的目的是使Num或字符串与包含的expr具有相同的生存期,从而允许我从函数返回它们

这个错误消息有些误导
Num
是一种特性,它是一种动态大小的类型,因此如果没有某种间接方式(引用或
),就不能有它的值。原因很简单,;问自己一个问题:枚举值必须有多大(以字节为单位)
expr
enum值?它当然至少和
字符串
一样大,但是
Num
呢?任意类型都可以实现这一特性,因此,为了使声音
expr
具有无限的大小

因此,您只能将traits作为类型与某种指针一起使用:
&Num
Box
。指针总是有固定的大小,而trait对象是“胖”指针,在其中保留额外的信息以帮助方法调度

此外,特征通常用作泛型类型参数的边界。因为泛型是单形的,所以它们在编译代码中会变成静态类型,所以它们的大小总是静态已知的,不需要指针。使用泛型应该是默认的方法,只有当您知道为什么泛型不适合您时,才应该切换到trait对象

这些是类型定义的可能变体。对于泛型:

enum Expr<N: Num> {
    Numeric(N),
    Symbol(String)
}
是一个生存期参数。它定义了引用的生存期和变量
Numeric
中trait对象内部的生存期
&'a Num+'a
是一种类型,您可以将其解读为“引用后面的特征对象,其寿命至少与
'a
一样长,其中的引用也至少与
'a
一样长”。也就是说,首先,指定
'a
作为参考生存期:
&'a
,其次,指定trait对象内部的生存期:
Num+'a
。后者是必需的,因为trait可以为任何类型实现,包括其中包含引用的类型,因此您需要将这些引用的最短生存期也放入trait对象类型中,否则借用检查将无法正确处理trait对象


使用
Box
时,情况非常相似<代码>框泛型版本使用起来很麻烦,因为实例化
符号可能会导致编译器无法推断
N
的具体类型。此外,如果最终
Expr
演变为包含子表达式的变体,则通用版本将无法扩展。我同意一般来说,应该首先考虑通用版本,但在这种情况下,我认为它不是正确的解决方案。此外,根据要求,用两个变量替换
Numeric(N)
可能就足够了:
Integer(i64)
Float(f64)
,以避免装箱。感谢这真的很有帮助。不过,我有一个问题,在Numeric(&'a Num+'a)中添加
a和在Numeric中添加
静态是什么(Box@FrancisGagn是的,你完全正确。我想添加这样的便条,但不知怎的忘了添加。谢谢!
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)
}
enum Expr<'a> {  // '
    Numeric(&'a Num + 'a),
    Symbol(String)
}
&'a SomeTrait + 'a
&'a SomeTrait + 'static
Box<SomeTrait + 'a>  // '
Box<SomeTrait + 'static>
&'a SomeTrait + 'b