Rust 为什么与Vec相比,SmallVec在存储具有生存期的类型时具有不同的行为?

Rust 为什么与Vec相比,SmallVec在存储具有生存期的类型时具有不同的行为?,rust,lifetime,Rust,Lifetime,我有三个例子,一个使用Vec,一个使用SmallVec,还有一个是我自己实现的SmallVec。使用Vec和我自己的SmallVec的可以编译,但使用真实SmallVec的不能编译 使用Vec的工作示例 使用std::borrow::Cow; 使用std::collections::HashMap; 酒吧特质我的特质{ fn通过id(&self,id:usize)->&ItemTraitReturns; } ///重要的部分在这里:`Vec(Vec>, } 针对MyTraitStruct的imp

我有三个例子,一个使用
Vec
,一个使用
SmallVec
,还有一个是我自己实现的
SmallVec
。使用
Vec
和我自己的
SmallVec
的可以编译,但使用真实
SmallVec
的不能编译

使用
Vec的工作示例
使用std::borrow::Cow;
使用std::collections::HashMap;
酒吧特质我的特质{
fn通过id(&self,id:usize)->&ItemTraitReturns;
}
///重要的部分在这里:`Vec(Vec>,
}
针对MyTraitStruct的impl MyTrait{
fn通过id(&self,id:usize)->&ItemTraitReturns获取{
让temp:&ItemTraitReturns`
//当我有`&ItemTraitReturns(SmallVec>)时,
}
针对MyTraitStruct的impl MyTrait{
fn通过id(&self,id:usize)->&ItemTraitReturns获取{
让temp:&ItemTraitReturns`
找到类型“%ItemTraitReturns=self.map.get(&id).unwrap();
20 | |//错误:
21 | |/=注意:应为类型`&demo2::ItemTraitReturns`
23 | |温度
24 | |     }
| |_____^
=注意:…不一定超过静态生存期
使用我自己的
SmallVec
当我实现自己的(非常幼稚)
SmallVec
(称为
NaiveSmallVec2
)时,代码也会编译…非常奇怪

使用std::borrow::Cow;
使用std::collections::HashMap;
///这是一个非常简单的SmallVec实现
发布结构2{
项目1:选择权,
项目2:选择权,
更多信息:Vec,
}
impl-naivec2{
发布fn推送(&M),项目:T){
如果self.item1.is_none(){
self.item1=一些(项目);
}如果self.item2.is_none(){
self.item2=一些(项目);
}否则{
自我。更多。推送(物品);
}
}
pub fn元素按索引(&self,index:usize)->选项{
匹配索引{
0=>self.item1.as_ref(),
1=>self.item2.as_ref(),
_=>self.more.get(索引-2),
}
}
}
酒吧特质我的特质{
fn通过id(&self,id:usize)->&ItemTraitReturns;
}
///重要的部分在这里:2
发布结构ItemTraitReturns>);
///仅接受具有静态生存期的项
发布结构MyTraitStruct{
map:HashMap=self.map.get(&id).unwrap();
//令人惊讶的是,这是有效的!
临时雇员
}
}

我希望
SmallVec
版本能够像
Vec
版本那样编译。我不明白为什么在某些情况下(在
Vec
的情况下)
&ItemTraitReturns
和在某些情况下(
SmallVec
)这是不可能的(我看不到
Vec
/
SmallVec
的影响)

我不想改变这种特质的寿命:

pub trait MyTrait{
fn通过id(&self,id:usize)->&ItemTraitReturns;
}

…因为在使用trait时,我不关心生命周期(这应该是一个实现细节)…但仍希望使用
SmallVec
此差异似乎是由
Vec
SmallVec
之间的方差差异造成的。虽然
Vec
T
中是协变的,
SmallVec
似乎是不变的。因此,
SmallVec(x:SmallVec>){
此处出现x//编译器错误:生存期不匹配
}

fn(巴)->VecIt您的问题似乎可以通过的答案来回答;特别是关于
may\u dangle
的部分。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。另外还询问了关于寿命差异的问题:;非常感谢!这正是我们的问题所在我一直在寻找:*不幸的是,我似乎必须在我的项目中去掉SmallVec(直到它像Vec一样协变):我的项目中的类型
ItemTraitReturns
要复杂得多,这种不变性继承了整个层次结构。
fn foo<'a, T>(x: SmallVec<[&'static T; 1]>) -> SmallVec<[&'a T; 1]> {
    x  // Compiler error here: lifetime mismatch
}

fn bar<'a, T>(x: Vec<&'static T>) -> Vec<&'a T> {
    x  // Compiles fine
}