如何声明除rust之外的相同类型的泛型参数?

洋平

我写了下面的代码,但是我不能写生命周期约束来工作并得到错误:

use futures::Future;

async fn foo<'a>(a: &'a str) -> &'a str {
    let task = get();
    f(a, task).await
}

async fn f<T>(v: T, task: impl Future<Output = T>) -> T {
    if true {
        v
    } else {
        task.await
    }
}

async fn get() -> &'static str {
    "foo"
}

错误:

error[E0759]: `a` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
 --> src/lib.rs:3:18
  |
3 | async fn foo<'a>(a: &'a str) -> &'a str {
  |                  ^  ------- this data with lifetime `'a`...
  |                  |
  |                  ...is captured here...
4 |     let task = get();
5 |     f(a, task).await
  |     - ...and is required to live as long as `'static` here

操场

我认为如果函数中的两个参数f可以具有各自的生存期,就可以解决例如,

v: T,
task: S,
T: 'a,
S: 'b,
'b: 'a,
S == T

如何解决这个问题?

E_net4一生

可以使用功能接口而不是异步功能,通过另一个最小示例来重现相同的问题。

fn get() -> impl FnOnce() -> &'static str {
    || "foo"
}

fn foo<'a, T: 'a, F>(_: &'a str, _: F)
where
    F: Fn() -> T,
    T: FnOnce() -> &'a str,
{
}

let x = "".to_string();
foo(&*x, &get);
error[E0597]: `x` does not live long enough
  --> src/main.rs:22:11
   |
22 |     foo(&*x, &get);
   |     ------^-------
   |     |     |
   |     |     borrowed value does not live long enough
   |     argument requires that `x` is borrowed for `'static`
23 | }
   | - `x` dropped here while still borrowed

这个例子可以让我们把get到函数参数,观察,通过此功能施加了硬约束的一生'a'static尽管有程序的最佳意图,但返回供应商功能(或承诺)的功能在输出寿命方面不提供协方差。也就是说,() -> &'static str不满足for<'a> () -> &'a str有时,编译器会退而建议您坚持使用'static生命周期中最薄弱的链接,即使这可能不是理想的。

请注意,目前,表示类型在其生命周期中是通用的类型的方法非常有限。这些是较高种类类型的一种形式,只能通过较高等级的特质范围(以及最终的泛型关联类型,一旦它们得到完全实现和稳定),才能在某种程度上指定表达能力。在这种情况下,与其尝试f为某种类型的工作T<'a>(伪代码),不如使我们的get泛型成为整个生命周期更好'a然后,子类型化可能会在实现中发生,因为我们知道字符串文字可以满足任何生存期。

fn get<'a>() -> impl FnOnce() -> &'a str {
    || "foo"
}

asyncPlayground情况下

async fn get<'a>() -> &'a str {
    "foo"
}

也可以看看:

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何强制Java接受相同类型的泛型参数

来自分类Dev

相同类型的Java泛型约束

来自分类Dev

泛型类中的方法能否返回与其参数列表相同类型的元组?

来自分类Dev

返回与作为参数提供的相同类型 - Java8 泛型

来自分类Dev

如何使用泛型类型获取具有相同类型的对象

来自分类Dev

如何使用泛型实现类型声明?

来自分类Dev

Java泛型:如何将泛型参数声明为另一个泛型参数的基本类型?

来自分类Dev

当泛型参数具有多种数据类型时,如何在rust中实现泛型?

来自分类Dev

具有不同类型泛型参数的方法的泛型类

来自分类Dev

泛型 - 函数返回类型与参数类型相同吗?

来自分类Dev

Java泛型:方法声明参数中的类型扩展

来自分类Dev

如何检查泛型参数关联类型?

来自分类Dev

如何在Kotlin中将泛型类映射到相同类的泛型数组

来自分类Dev

Rust泛型:预期的类型参数,找到&T

来自分类常见问题

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

如何声明返回相同类型的Func Delegate的Func Delegate?

来自分类Dev

全局声明泛型类型

来自分类Dev

如何从泛型定义和泛型参数获取泛型类型?

来自分类Dev

如何从泛型定义和泛型参数获取泛型类型?

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

在最终方法中使用泛型,该方法返回与其对象相同类型的值

来自分类Dev

Java:为什么泛型类不强制执行相同类型?

来自分类Dev

如何使用参数Array <Codable>声明泛型方法?

来自分类Dev

Scala泛型:如何声明类型必须为case类?

来自分类Dev

如何在接口中声明可选的泛型类型?

来自分类Dev

没有明确声明的泛型类型的分配如何被滥用?

来自分类Dev

如何使用泛型类型声明类 - Java 1.7

来自分类Dev

泛型-返回不同类型的对象

Related 相关文章

  1. 1

    如何强制Java接受相同类型的泛型参数

  2. 2

    相同类型的Java泛型约束

  3. 3

    泛型类中的方法能否返回与其参数列表相同类型的元组?

  4. 4

    返回与作为参数提供的相同类型 - Java8 泛型

  5. 5

    如何使用泛型类型获取具有相同类型的对象

  6. 6

    如何使用泛型实现类型声明?

  7. 7

    Java泛型:如何将泛型参数声明为另一个泛型参数的基本类型?

  8. 8

    当泛型参数具有多种数据类型时,如何在rust中实现泛型?

  9. 9

    具有不同类型泛型参数的方法的泛型类

  10. 10

    泛型 - 函数返回类型与参数类型相同吗?

  11. 11

    Java泛型:方法声明参数中的类型扩展

  12. 12

    如何检查泛型参数关联类型?

  13. 13

    如何在Kotlin中将泛型类映射到相同类的泛型数组

  14. 14

    Rust泛型:预期的类型参数,找到&T

  15. 15

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  16. 16

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  17. 17

    如何声明返回相同类型的Func Delegate的Func Delegate?

  18. 18

    全局声明泛型类型

  19. 19

    如何从泛型定义和泛型参数获取泛型类型?

  20. 20

    如何从泛型定义和泛型参数获取泛型类型?

  21. 21

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  22. 22

    在最终方法中使用泛型,该方法返回与其对象相同类型的值

  23. 23

    Java:为什么泛型类不强制执行相同类型?

  24. 24

    如何使用参数Array <Codable>声明泛型方法?

  25. 25

    Scala泛型:如何声明类型必须为case类?

  26. 26

    如何在接口中声明可选的泛型类型?

  27. 27

    没有明确声明的泛型类型的分配如何被滥用?

  28. 28

    如何使用泛型类型声明类 - Java 1.7

  29. 29

    泛型-返回不同类型的对象

热门标签

归档