当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以省略这个特征的寿命?

鲁峰
2023-03-14

我又在和生命搏斗了。或者事实上,我赢得了这场战斗,但我不确定结果是否是预期的处理方式。

假设我有一个有两个生存期的结构:内部

我想出了这个(它有效!)但我有几个问题

struct Inner<'a, 'b>{
    foo: &'a str,
    bar: &'b str
}

trait Worker<'data, 'a, 'b> {
    fn new (inner: &'data Inner<'a, 'b>) -> Self;
    fn work_with_inner () { println!("works on inner");}
}

struct SomeWorker<'inner, 'a:'inner, 'b:'inner> {
    inner: &'inner Inner<'a, 'b>
}

impl<'data, 'a, 'b> Worker<'data, 'a, 'b> for SomeWorker<'data, 'a, 'b> {
    fn new (inner: &'data Inner<'a, 'b>) -> Self {
        SomeWorker {
            inner: inner
        }
    }
}

fn main () {
}

游戏Geofence:http://is.gd/A3ol4w

>

  • 就生命周期而言,这可以简化吗?特别是,我想知道这个特征是否真的需要定义所有这些生命周期,或者是否有一种方法只在结构上定义它们?

    如果没有办法省略trait上的生命周期,那么这是否意味着为实现者指定trait上所有可能的生命周期是一种最佳实践?我的意思是,如果SomeWorkerstruct不想存储internal的引用,那么整个过程,包括trait,可能会简单得多。

    看,根本没有生命。

    struct Inner<'a, 'b>{
        foo: &'a str,
        bar: &'b str
    }
    
    trait Worker {
        fn new (inner: &Inner) -> Self;
        fn work_with_inner () { println!("works on inner");}
    }
    
    struct SomeWorker;
    
    impl Worker for SomeWorker {
        fn new (inner: &Inner) -> Self {
            SomeWorker
        }
    }
    
    fn main () {
    }
    

    游戏Geofence:http://is.gd/NzigjX

    这就是为什么我要问自己,作为trait的作者,我是否应该假设所有引用的方法最终都会被trait实现者存储在一个字段中,因此我需要指定trait上的所有生命周期,以使实现者能够这样做。


  • 共有1个答案

    秦涵映
    2023-03-14

    没有一刀切的解决办法。作为一个特质作者,你必须思考你试图做什么,你想实现什么。

    如果您希望能够将生命周期值与结构的生命周期参数关联起来,那么必须将生命周期放在trait上。通常会这样做,因为您的trait有多个方法可以在生命周期内对同一个值进行操作。这可能有点像getter/setter对。在我编写的一些代码中,我正在传递

    在您的例子中,您有一个构造函数方法,它需要知道结构是否存在生命周期。你可以将这一功能与其他特征区分开来,如果它确实不同的话。在您的示例中,work\u with_internal方法不接受self参数,因此这是非常明显的。如果您使用了self,但不需要与internal中的生命周期交互,它仍然可以帮助您:

    trait WorkerBuilder<'a, 'b> {
        fn new(inner: Inner<'a, 'b>) -> Self;
    }
    
    trait Worker {
        fn do_work(&self);
    }
    
    #[derive(Debug)]
    struct Inner<'a, 'b>{
        foo: &'a str,
        bar: &'b str,
    }
    
    // This does track `Inner`
    #[derive(Debug)]
    struct SomeWorker<'a, 'b>(Inner<'a, 'b>);
    
    impl<'a, 'b> WorkerBuilder<'a, 'b> for SomeWorker<'a, 'b> {
        fn new(inner: Inner<'a, 'b>) -> SomeWorker<'a, 'b> {
            SomeWorker(inner)
        }
    }
    
    impl<'a, 'b> Worker for SomeWorker<'a, 'b> {
        fn do_work(&self) { println!("Doing work, {:?}", self.0) }
    }
    
    // This doesn't track `Inner`
    #[derive(Debug)]
    struct DumbWorker;
    
    impl<'a, 'b> WorkerBuilder<'a, 'b> for DumbWorker {
        fn new(inner: Inner<'a, 'b>) -> DumbWorker {
            DumbWorker
        }
    }
    
    fn main () {}
    

    你会看到我还应用了一件你可以做的事情来减少寿命。如果您的结构只是引用(或引用和其他小Copy类型),则无需向该结构传递引用。引用是可复制的,跟踪包含结构的生存期没有用。

    编辑-我不觉得“构造函数”方法在一个特性中通常是有用的。您通常希望提供不同的集合或参数,这就是为什么您首先要使用不同的类型。也许您真正的代码在trait中使用的不是构造函数。

     类似资料:
    • 问题内容: PMD可以忽略Java源文件中带有注释的特定警告。 Checkstyle有类似的选择吗? 问题答案: 是的,请查看SuppressionCommentFilter和SuppressWithNearbyCommentFilter选项。

    • 我需要向用户显示以下座位并能够预订和取消预订。 我也尝试了unordered_map,但无论我做什么,我都无法使map以我想要的方式显示座位(1A,1B,1C,1D,1E)。 1A 1B 1C 1D 1E 2A 2B 2C 2D 2E... 尝试将座位名称更改为A1 B1 C1 D1...显然,我是C++新手。我知道地图是有序的,并且我知道使用unordered_map无法保证地图的显示方式。 我

    • 简而言之:有没有一种方法可以在gcc或CLANG中不推荐命名空间? 长: 现在我想知道是否有更好的方法来做类似的事情,比如将名称空间util的使用标记为不推荐使用。 我们使用GCC4.7.3作为生产编译器,但是针对clang进行构建和测试,以尝试捕捉gcc的细节;因此,在这些编译器上工作的东西会有所帮助。

    • 我知道一个测试可以通过运行来运行,在sbt中, 有没有办法告诉sbt/scalatest在没有标签的情况下运行单个测试?例如: 这意味着“在类中运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心去标记它们,那么有没有办法在没有标签的情况下运行单个测试?

    • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。

    • 问题内容: 在此问题中找到了我能找到的最接近的示例:https : //github.com/tensorflow/tensorflow/issues/899 使用此最小的可复制代码: 但是,返回的FLOPS始终为“无”。有没有一种方法可以具体测量FLOPS,尤其是PB文件? 问题答案: 有点晚了,但也许将来对某些访客有帮助。对于您的示例,我成功测试了以下代码段: 也可以将分析器与以下代码段结合使