fn foo<'a, T>()
where T : 'a 
{
   //code a
}

fn foo()
{
   //code b
}

其中,类型T是具有生存期参数的任何类型. 在代码a中可以做什么,而在代码b中不能做什么?

我希望它们是完全相同的,因为我不明白其中的区别和生命周期界限的具体含义.如果第一个函数可以更容易地解释用例(如参数),则可以建议对其进行添加.

推荐答案

您可以在下面的代码中看到BIND是必需的:

trait Elem {}

struct List<'a> {
    v: Vec<Box<dyn Elem + 'a>>,
}

impl<'a> List<'a> {
    fn push<T: Elem>(&mut self, t: T) {
        self.v.push(Box::new(t));
    }
}
error[E0309]: the parameter type `T` may not live long enough
 --> src/lib.rs:9:21
  |
9 |         self.v.push(Box::new(t));
  |                     ^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
  |
help: consider adding an explicit lifetime bound...
  |
8 |     fn push<T: Elem + 'a>(&mut self, t: T) {
  |                     ++++

从本质上讲,泛型类型可以有任意生存期,但有时需要在只允许特定生存期的上下文中使用泛型类型.在这种情况下,List<'a>只能保存生命周期 至少为'a的元素.因此,对于这些情况,存在T: 'a的约束.T: 'static是这种语法最常见的情况,它表示该类型可能根本不包含任何本地引用.

Rust相关问答推荐

关联类型(类型参数)命名约定

我如何在Rust中使用传递依赖中的特征?

这种获取-释放关系是如何运作的?

编译项目期间使用Cargo生成时出现rustc错误

使用铁 rust S还原对多个数组执行顺序kronecker积

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

是否可以在不切换到下一个位置的情况下获得迭代器值:

在 Rust 中用问号传播错误时对类型转换的困惑?

Rust Axum 框架 - 解包安全吗?

Rust 中的内存管理

更新 rust ndarray 中矩阵的一行

Rust:为什么 Pin 必须持有指针?

中文优化标题:跳出特定循环并返回一个值

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

如何将 Rust 字符串转换为 i8(c_char) 数组?

`use std::error::Error` 声明中断编译

如何获得对数组子集的工作可变引用?

如何解析 Rust 中的 yaml 条件字段?

Rust 中的let是做什么的?

在特征中返回一个 Self 类型的值