Asynchronous 使用self导致错误的异步方法;返回一个值,该值引用当前函数所拥有的数据;

Asynchronous 使用self导致错误的异步方法;返回一个值,该值引用当前函数所拥有的数据;,asynchronous,rust,async-await,reference,builder,Asynchronous,Rust,Async Await,Reference,Builder,是否可以在异步方法中使用self 这是我的方法(请注意,poller与rust futures中的poll方法无关) pub async fn all(self)->WebDriverResult{ 会话:&'WebDriverSession, 轮询器:ElementPoller, 选择器:Vec{ 发布元素id:ElementId, 发布会话:&'WebDriverSession, } ElementId只是String周围的一个新类型包装器-没有引用 这是否与返回以后可能执行的未来的方法有

是否可以在异步方法中使用self

这是我的方法(请注意,
poller
与rust futures中的
poll
方法无关)

pub async fn all(self)->WebDriverResult{
会话:&'WebDriverSession,
轮询器:ElementPoller,
选择器:Vec{
发布元素id:ElementId,
发布会话:&'WebDriverSession,
}
ElementId
只是
String
周围的一个新类型包装器-没有引用

这是否与返回以后可能执行的
未来
的方法有关?或者与在
.wait
边界上保留的内容有关

如果返回的唯一引用是
&WebDriverSession
,并且该引用是通过
new()
传入的,那么为什么它告诉我返回的是该函数拥有的引用

编辑:通过有效地内联一些代码而不是调用其他异步函数来编译此文件。仍然不确定此操作失败的原因,只是它似乎与跨边界保留引用有关。等待边界,即使该引用不属于任何一方的函数/结构

下面是一个操场链接,带有一个简化示例:

你能创建一个在操场上运行的最小示例并展示它吗?这将有助于实验。我会给它一个GO,在不同的地方有相同的错误,但我相信原因是相同的:更新以显示一个示例,它工作与不工作,取决于它是否调用另一个异步fn或内联执行相同的代码:你的final link有不同的问题,它借用选择器(由于
for…in selectors.iter()
)而不是使用它(
for…in selectors.into_iter()
或只是
for…in selectors
)。修复了暴露出生命周期问题的问题,其中
运行()
将其结果绑定到选择器的生存期,而不是会话的生存期。这会导致一个我不太理解的借用检查器错误,无论是否返回
elems
,都会发生这种错误。您能否创建一个在操场上运行的最小示例并演示这一点?这将有助于进行实验。I'l我给它一个GO,在不同的地方有相同的错误,但我相信原因是相同的:更新显示了一个示例,说明它工作与不工作,这取决于它是否调用另一个异步fn还是内联执行相同的代码:您的最终链接有不同的问题,它借用了选择器(由于
for…in selectors.iter()
)而不是使用它(
for…in-selectors.into_iter()
或只是
for…in-selectors
)。修复显示生存期问题的问题,其中
run()
将其结果绑定到选择器的生存期,而不是会话的生存期。这会导致我不太理解的借用检查器错误,无论是否返回
elems
,都会发生该错误。
error[E0515]: cannot return value referencing local data `self.poller`
   --> src/query.rs:193:9
    |
193 |         self.poller.run(&self.selectors).await
    |         -----------^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |         |
    |         returns a value referencing data owned by the current function
    |         `self.poller` is borrowed here