作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了下面的代码,但我不能写生命时间约束来工作并得到一个错误:
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
playground
f
中有两个参数可以解决可以有自己的一生。
v: T,
task: S,
T: 'a,
S: 'b,
'b: 'a,
S == T
如何解决这个问题?
最佳答案
同样的问题可以用另一个最小的例子来重现,使用函数接口(interface)而不是异步函数。
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
.尽管程序有最好的意图,但返回供应商函数(或 promise )的函数不会提供关于输出生命周期的协方差。也就是说,
() -> &'static str
不满足
for<'a> () -> &'a str
.有时,编译器会回退到建议您坚持最薄弱的环节,即
'static
。终生,即使这可能是不可取的。
f
为一种工作
T<'a>
(伪代码),最好只制作我们的
get
终身通用
'a
.然后子类型化可能会在实现中发生,因为我们知道字符串文字可以满足任何生命周期。
fn get<'a>() -> impl FnOnce() -> &'a str {
|| "foo"
}
在
async
案例(
Playground):
async fn get<'a>() -> &'a str {
"foo"
}
也可以看看:
关于rust - 如何在 rust 中声明除生命周期之外的相同类型的泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65769775/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!