Rust 对泛型使用更高等级的特征边界

Rust 对泛型使用更高等级的特征边界,rust,lifetime,Rust,Lifetime,我偶然发现了一个有趣的边缘案例:使用排名更高的生存期界限来接受返回泛型参数的闭包,例如R:MyTrait的。无法指定R最多只能生存'a。也许最好用一个例子来解释 让我们定义一个简单的引用,如包装值的类型: struct源代码; struct Ref(&'a self,value:i32)->Ref F:FnOnce(&'a Source)->Ref i32; } 恳求{ fn值(&self)->i32{ 自我价值 } } 并修改整数复制例程,以返回实现该特性的泛型类型,而不是仅返回Ref: f

我偶然发现了一个有趣的边缘案例:使用排名更高的生存期界限来接受返回泛型参数的闭包,例如R:MyTrait的
。无法指定
R
最多只能生存
'a
。也许最好用一个例子来解释

让我们定义一个简单的引用,如包装值的类型:

struct源代码;
struct Ref(&'a self,value:i32)->Ref F:FnOnce(&'a Source)->Ref i32;
}
恳求{
fn值(&self)->i32{
自我价值
}
}
并修改整数复制例程,以返回实现该特性的泛型类型,而不是仅返回
Ref

fn call_2(callback:F)->i32
哪里
对于R,
R:我的特质,
{
让源=源;
回调(&source).value()
}
fn花式复制2(值:i32)->i32{
调用|2(| s | s.new|u ref(值))
}
突然,我发现一个错误:
由于需求冲突,无法推断自动引用的适当生存期。从某种角度来看,这实际上是有道理的:与
refr不同,
R:MyTrait+'a,
这当然是不正确的,因为
'a
仅为第一个边界定义

这就是我感到困惑的地方,我开始搜索,但从来没有找到任何关于在一个绑定中组合HRTBs和泛型类型的信息。也许有经验的铁锈人有什么建议

Upd 1

当我进一步思考这个问题时,我记得我可以使用
impl-Trait
语法。这看起来像是我问题的解决方案:

fn call_3(callback:F)->i32
哪里
F:for(impl MyTrait+'a),
{
让源=源;
回调(&source).value()
}
fn花式复制3(值:i32)->i32{
调用|3(| s | Box::new(s.new|u ref(value)))
}
但是,这不起作用,因为出于某种原因(可能是暂时的),这里不允许使用
impl MyTrait
。但这让我想到了
dyn-Trait
语法,这确实有效

fn call_4(callback:F)->i32
哪里
F:盒子