如何表达闭包的生命周期限制以匹配特征有界生命周期?

恶棍

我有一个特征,该特征会返回附加到其自身生命的借项:

trait SomeTrait {
    fn do<'a>(&'a self, other: &AnonymousLifetime) -> &'a Output;
}

如何在闭包where子句中表达相同的限制,以便SomeTrait可以impl From<Closure>

场景的一个最小的,可复制的示例操场):

// The traits
trait Context {
    fn give(&self) -> usize;
}
trait ContextDecider {
    fn decide<'a>(&'a self, context: &dyn Context) -> &'a str;
}

// A concrete implementation example
// As expected, works OK
struct SomeDecider(Vec<String>);
impl ContextDecider for SomeDecider {
    fn decide<'a>(&'a self, context: &dyn Context) -> &'a str {
        let some_context = context.give();
        if some_context > self.0.len() {
            panic!("Oh no!");
        }

        &self.0[some_context]
    }
}

// An implemetation for a closure
// Help here!!
impl<'a, F> ContextDecider for F
where
    F: 'a + Fn(&dyn Context) -> &'a str,
{
    fn decide<'b>(&'b self, giver: &dyn Context) -> &'b str {
        self(giver)
    }
}

无法编译:

error[E0312]: lifetime of reference outlives lifetime of borrowed content...
  --> src/lib.rs:30:9
   |
30 |         self(giver)
   |         ^^^^^^^^^^^
   |
note: ...the reference is valid for the lifetime `'b` as defined on the method body at 29:15...
  --> src/lib.rs:29:15
   |
29 |     fn decide<'b>(&'b self, giver: &dyn Context) -> &'b str {
   |               ^^
note: ...but the borrowed content is only valid for the lifetime `'a` as defined on the impl at 25:6
  --> src/lib.rs:25:6
   |
25 | impl<'a, F> ContextDecider for F
   |      ^^

在示例中,我未能在封闭范围内表达特征施加的限制,并且编译器不满意。
编译器没有帮助我使用应使用的语法,这将使我将两个生命周期锁定在一起。

mu

您可以将函数包装在另一个结构(此处称为FnWrapper)中:

trait Context {
    fn give(&self) -> usize;
}
impl Context for () {
    fn give(&self) -> usize {0}
}
trait ContextDecider {
    fn decide<'a>(&'a self, context: &dyn Context) -> &'a str;
}

struct SomeDecider(Vec<String>);
impl ContextDecider for SomeDecider {
    fn decide<'a>(&'a self, context: &dyn Context) -> &'a str {
        let some_context = context.give();
        if some_context > self.0.len() {
            panic!("Oh no!");
        }

        &self.0[some_context]
    }
}

struct FnWrapper<'a, F> {
    f: F,
    _phantom: std::marker::PhantomData<& 'a ()>,
}
impl<'a, F> FnWrapper<'a, F> 
    where F: 'a + Fn(&dyn Context) -> &'a str,
{
    fn new(f: F) -> Self {
        Self {
            f,
            _phantom: Default::default(),
        }
    }
    fn f_decide<'b>(&'b self, giver: &dyn Context) -> &'b str {
        (self.f)(giver)
    }
}

impl<'a, F> ContextDecider for FnWrapper<'a, F>
where
    F: 'a + Fn(&dyn Context) -> &'a str,
{
    fn decide<'b>(&'b self, giver: &dyn Context) -> &'b str {
        self.f_decide(giver)
    }
}

fn main() {
    println!("{}", FnWrapper::new(|giver| vec!["1", "2", "3"][giver.give()]).decide(&()));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ContentProvider销毁/生命周期

来自分类Dev

嵌套片段生命周期

来自分类Dev

如何列出所有可用的Maven生命周期?

来自分类Dev

Chrome应用生命周期

来自分类Dev

Swift闭包中保留内存的生命周期

来自分类Dev

Imgur图像的生命周期

来自分类Dev

组件生命周期

来自分类Dev

MarshalByRefObject生命周期

来自分类Dev

具有特征的类型定义:指定显式生命周期限制的区别?

来自分类Dev

活动生命周期图中的矛盾与生命周期的描述

来自分类Dev

片段的Robospice生命周期

来自分类Dev

如何管理认知令牌生命周期

来自分类Dev

如何解决传递给闭包的&PathBuf的生命周期要求冲突?

来自分类Dev

通用特征实现的生命周期

来自分类Dev

ComponentDidMount()生命周期

来自分类Dev

如何测试Azure存储生命周期?

来自分类Dev

从功能参数实现具有生命周期限制的切片的特征

来自分类Dev

从具有生命周期的结构转换为特征

来自分类Dev

RequestLocationUpdates生命周期

来自分类Dev

ViewPager的生命周期

来自分类Dev

在 Rust 中将具有显式生命周期的闭包作为参数

来自分类Dev

如何增加绑定的生命周期

来自分类Dev

Rust 抱怨生命周期需求冲突,没有迭代器或闭包

来自分类Dev

如何将生命周期设置为在闭包中捕获的值?

来自分类Dev

对象的生命周期

来自分类Dev

Rust 中闭包参数的生命周期问题

来自分类Dev

订阅的生命周期

来自分类Dev

如何向闭包添加生命周期参数而不返回引用

来自分类Dev

如何使用现有代码实现生命周期事件