HRTB:由包含生命周期类型参数的特征界定的具体类型与仅由生命周期类型参数界定的具体类型

2024-03-07

这实际上是一个offshoot https://stackoverflow.com/questions/54791718/whats-the-difference-between-a-traits-generic-type-and-a-generic-associated-ty#comment105546315_54803174这个的SO https://stackoverflow.com/questions/54791718/whats-the-difference-between-a-traits-generic-type-and-a-generic-associated-ty问题。

考虑以下代码:

trait Trait<'b> {
    fn func(&'b self) {}
}

struct Struct {}

impl<'s> Trait<'s> for Struct {}

fn test<'s, T:'s>(t: T)
where
    T: Trait<'s>,
{
    t.func();
}

它失败了,因为编译器看到了t寿命少于's and 's由调用者设置(即比堆栈帧长)func) 并且特征对于类型参数是不变的。但是,如果我在这里引入 HRTB(更高等级特征界限),代码将编译:

fn test<T>(t: T)
where
    T: for<'s> Trait<'s>,
{
    t.func();
}

现在,特质Trait<'s>为所有可能的生命周期实施's代表,因此编译器会选择正确的一个。

但为什么下面的代码会失败呢?

struct Temp<'a> {
    x: &'a i32,
}

fn test<T>(t: T)
where
    for<'s> T: 's,
{
}

fn main() {
    let d = 1i32;
    test(Temp { x: &d });
}

它给出了错误:

error[E0597]: `d` does not live long enough
  --> src/main.rs:13:20
   |
13 |     test(Temp { x: &d });
   |     ---------------^^---
   |     |              |
   |     |              borrowed value does not live long enough
   |     argument requires that `d` is borrowed for `'static`
14 | }
   | - `d` dropped here while still borrowed

这里有什么区别呢?从概念上讲,我发现前面的示例与此示例相同。为什么预期具体类型T应该仅是/包含参考文献'static寿命?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HRTB:由包含生命周期类型参数的特征界定的具体类型与仅由生命周期类型参数界定的具体类型 的相关文章

  • 如何创建静态字符串数组?

    Note这个问题包含 Rust 1 0 之前的语法 代码无效 但概念仍然相关 如何在 Rust 中创建全局静态字符串数组 对于整数 编译如下 static ONE u8 1 static TWO u8 2 static ONETWO sta
  • 无约束类型参数错误

    我正在尝试将 glium 与 cgmath 连接起来 下列的这个答案 https stackoverflow com a 40028032 5397009 我已经实现了ToArray要转换实例的特征cgmath Matrix4转换成 gli
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • Scala 中的特征和抽象方法重写

    我有一个基本抽象类 特征 它有一个抽象方法foo 它由几个派生类扩展和实现 我想创建一个可以混合到派生类中的特征 以便它实现foo 然后调用派生类的foo 就像是 trait Foo def foo trait M extends Foo
  • 什么是构建依赖项?

    构建依赖关系 中解释货物簿 https doc rust lang org cargo reference specifying dependencies html build dependencies 您可以依赖其他基于 Cargo 的板
  • 有没有办法以数组的形式访问结构体字段?

    我是 Rust 新手 正在尝试弄清楚这是否可行 因此 有时函数 方法以数组形式访问数据会更干净 有时按名称访问数据会更干净 在 Rust 中我可以定义这样的东西 struct Vector3D x f64 y f64 z f64 coord
  • 我可以在 Rust 中将 const 与重载运算符一起使用吗?

    在此代码中 allow dead code use std ops Add struct Foo i32 const X i32 1 const Y i32 X X const A Foo Foo 1 const B Foo A A imp
  • 何时使用 Box> 或 Vec>?

    什么时候设计一个嵌套的数据结构才有意义 Box and a Vec 或相反亦然 似乎在大多数情况下 您想在堆上存储多个固定大小的东西 Box是多余的 因为它唯一的 作用是堆分配一个 单个值 以及一个正常的Vec已经在堆上分配其存储空间 背景
  • 是否可以在不使用“Arc”的情况下拥有“内部指针”?

    struct Device struct CommandBuffer device Device Does not work because Rust does not allow internal pointers struct Some
  • 如何匹配特质实现者

    我有一个由某些结构实现的特征 我想编写一个模式匹配 可以处理每种可能的情况 trait Base struct Foo x u32 struct Bar y u32 impl Base for Foo impl Base for Bar f
  • 扭曲和响应类型以及特征对象?

    我有一个扭曲拒绝处理程序 我像这样使用它 recover handle rejection 它是这样声明的 pub async fn handle rejection err Rejection gt Result
  • PHP 特性 - 定义通用常量

    定义可由命名空间内的多个类使用的常量的最佳方法是什么 我试图避免过多的继承 因此扩展基类不是理想的解决方案 并且我正在努力寻找使用特征的良好解决方案 这在 PHP 5 4 中是否可行 或者应该采取不同的方法 我有以下情况 trait Bas
  • 为什么 Rust 在运行时检查数组边界,而(大多数)其他检查发生在编译时?

    正在阅读基本介绍 http doc rust lang org book arrays vectors and slices html 如果您尝试使用不在数组中的下标 您将收到错误 数组访问在运行时进行边界检查 为什么 Rust 在运行时检
  • 为什么 ops::Range 不实现 Copy,即使 T 是 Copy?

    最近 我想编写一个保存 3D 投影参数的类型 use std ops Range derive Clone Copy struct CamProj Near and far plane proj range Range
  • 可变借用不止一次[重复]

    这个问题在这里已经有答案了 这是无法编译的简短示例的简短示例 错误在于add1功能 如果我这样做的话它会起作用add2 但这不是很干 有更多经验的人能否启发我如何以比以前更好的方式克服可变借用错误 add2 struct S1 full b
  • 使用 Yew 回调作为 wasm_bindgen 闭包

    这个问题是为 Yew v0 19 编写的 异步外部 JavaScript 函数可以通过以下方式在 Rust 中使用Closures https rustwasm github io wasm bindgen api wasm bindgen
  • 有没有办法使用现有的结构作为枚举变体?

    我使用枚举来实现多态性 类似于以下内容 enum MyType Variant1 a i32 b i32 Variant2 a bool b bool 有没有干净的方法来使用现有的结构Variant1 and Variant2 我做了以下事
  • 如何消除 Rust 中特征的歧义?

    我想使用write fmt两种不同类型的对象上的方法 use std fmt Write use std io Write fn main let mut a String new let mut b std fs File create
  • 如何在 WSL 上构建使用 device_query crate 的项目?

    我正在尝试使用以下命令跟踪在 WSL 中键入了哪些键设备查询 https crates io crates device query箱 我已经阅读了板条箱的文档 添加了device query 0 2 4 到我的 Cargo toml 文件
  • 实现 Index 特征以返回非引用的值

    我有一个想要实现的简单结构Index 但作为 Rust 的新手 我在借用检查器方面遇到了许多麻烦 我的结构非常简单 我想让它存储一个起始值和步骤值 然后当由usize它应该返回start idx step pub struct MyStru

随机推荐