【问题标题】:What does this higher-ranked trait bound mean?这个更高级别的特征界限是什么意思?
【发布时间】:2022-01-02 16:23:09
【问题描述】:

在 Salsa 中,一个特性绑定了一个更高级别的特性。我在函数定义上看到过 HRTB,但在特征上却没有。什么意思?

pub trait Query: Debug + Default + Sized + for<'d> QueryDb<'d> {
...
    fn query_storage<'a>(
        group_storage: &'a <Self as QueryDb<'_>>::GroupStorage,
    ) -> &'a Arc<Self::Storage>;
}

https://github.com/salsa-rs/salsa/blob/fc6806a/src/lib.rs#L370

如题,我该如何阅读?是不是说,对于任何Query,都有一个对应的QueryDB 具有一些 生命周期?

这有什么不同

pub trait Query<'d>: Debug + Default + Sized + QueryDb<'d>

除此之外 impls 不能指定 'd?

【问题讨论】:

    标签: rust traits lifetime


    【解决方案1】:

    我该如何阅读?

    这意味着Query 的任何实现也同时为'd 的所有可能值(即所有生命周期)实现QueryDb&lt;'d&gt;。因此,在一般上下文中,特征绑定 T: Query 意味着 T: for&lt;'d&gt; QueryDb&lt;'d&gt;

    这有什么不同

    pub trait Query<'d>: Debug + Default + Sized + QueryDb<'d>
    

    除此之外 impls 不能指定 'd?

    通过在Query 上重复生命周期参数,这意味着所有特征边界T: Query 都需要更改为T: for&lt;'d&gt; Query&lt;'d&gt;,以便等同于HRTB 在Query 本身中的版本。

    这基本上是a workaround for the lack of generic associated types。对于泛型关联类型,QueryDb 将改为如下所示:

    pub trait QueryDb: Sized {
        /// Dyn version of the associated trait for this query group.
        type DynDb<'d>: ?Sized + Database + HasQueryGroup<Self::Group> + 'd;
    
        /// Associate query group struct.
        type Group: plumbing::QueryGroup<GroupStorage = Self::GroupStorage>;
    
        /// Generated struct that contains storage for all queries in a group.
        type GroupStorage;
    }
    

    在引入此生命周期参数的pull request 之前,QueryDb 不是单独的特征;它的成员是Query 的一部分。通用关联类型允许我们将QueryDb 合并回Query

    在阅读了有关该拉取请求的 cmets 后,我的印象是此更改没有产生预期的结果。目标是允许与关联类型DynDb 上隐含的'static 不同的界限,但由于每个Query 对所有可能的QueryDb&lt;'d&gt; 实现QueryDb&lt;'d&gt;,这意味着每个Query 实现QueryDb&lt;'static&gt;。因此,在QueryDb的所有实现中,DynDb不可能借用任何生命周期短于'static的东西,否则Query的实现将不被允许(绑定for&lt;'d&gt; QueryDb&lt;'d&gt;不会被满足)。

    【讨论】:

      【解决方案2】:

      这与query_storage的参数类型有关:

      Self as QueryDb<'_>
      

      从书上看:

      for&lt;'a&gt; 可以读作“对于所有选择 'a”,并且基本上会生成 F 必须满足的无限特征边界列表。

      https://doc.rust-lang.org/nomicon/hrtb.html

      【讨论】:

      • 但这可以是Self as QueryDb&lt;'d&gt; 如果trait Query&lt;'d&gt;: ... + QueryDb&lt;'d&gt;!
      • 这并不能完全回答问题,您愿意详细说明吗?
      猜你喜欢
      • 2019-10-11
      • 2019-01-12
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      相关资源
      最近更新 更多