Rust 是否有方法将引用传递给泛型函数并返回一个不为';t与参数有关';什么是生命?
我已经在下面的示例中解决了一个问题,我使用了不必要的堆分配来解决这个问题:Rust 是否有方法将引用传递给泛型函数并返回一个不为';t与参数有关';什么是生命?,rust,Rust,我已经在下面的示例中解决了一个问题,我使用了不必要的堆分配来解决这个问题: // Try replacing with (_: &String) fn make_debug<T>(_: T) -> impl std::fmt::Debug { 42u8 } fn test() -> impl std::fmt::Debug { let value = "value".to_string(); // try removing the am
// Try replacing with (_: &String)
fn make_debug<T>(_: T) -> impl std::fmt::Debug {
42u8
}
fn test() -> impl std::fmt::Debug {
let value = "value".to_string();
// try removing the ampersand to get this to compile
make_debug(&value)
}
pub fn main() {
println!("{:?}", test());
}
我至少可以通过两种方式修复此错误:
test()
中传入对value
的引用,而是传入value
本身T
,而是将make_debug
的参数类型显式声明为&String
或&str
impl Debug
值
有没有办法保持代码参数化,继续传递引用,并让借用检查器接受它?我认为这是由于
impl-trait
不透明类型如何捕获生存期的规则造成的
如果参数T
中存在生存期,则impl trait
必须合并它们。类型签名中的其他生存期遵循正常规则
有关更多信息,请参阅:
fn发送表单(self,data:&T)->SendFormFuture;
通过查看SendFormFuture
,我们可以很容易地观察到那里根本没有T
的残余。因此,即使T
有自己的生命周期需要处理,我们知道所有引用都在send\u表单的主体中使用,并且以后再也不会被SendFormFuture
使用
但是,使用impl Future
作为输出,我们没有得到这样的保证。无法知道Future的具体实现是否实际上保留了T
在T
没有引用的情况下,这仍然不是问题。要么是impl Future
引用了T
,并完全拥有它的所有权,要么是它没有引用它,并且不会出现生存期问题
但是,如果T
确实有引用,您可能最终会遇到这样的情况:具体的impl Future
保存在T
中的引用。即使impl Future
拥有T
本身的所有权,它也不拥有T
引用的值的所有权
这就是为什么借阅支票必须是保守的,并且坚持T
中的任何引用都必须有的静态寿命
我能看到的唯一解决方法是绕过impl Future
,并在返回类型中显式显示。然后,您可以很容易地向借阅检查器演示输出类型根本不引用输入T
类型,其中的任何引用都是无关的
actix web客户端中发送表单
的原始代码如下所示:
发布fn发送表单(
自己
值:&T,
)->impl未来<
Item=ClientResponse,
Error=SendRequestError,
> {
let body=match serde_urlencoded::to_字符串(值){
Ok(body)=>body,
Err(e)=>返回::A(Err(Error::from(e).into()),
};
//设置内容类型
如果没有,则设slf=self.set\u header\u(
标题::内容类型,
“application/x-www-form-urlencoded”,
);
或者::B(slf.send_body(body::Bytes(Bytes::from(body)))
}
您可能需要对库进行修补,或者编写自己的函数来执行相同的操作,但使用具体的类型。如果其他人知道如何处理impl trait
这个明显的局限性,我很乐意听到
下面是我在awc
(actix web客户端库)中重写send\u form
所取得的进展:
pub fn send\u form\u alt(
自己
值:&T,
//)->impl未来<
//Item=ClientResponse,
//Error=SendRequestError,
)->要么<
未来结果,
暗示未来<
Item=板条箱::响应::ClientResponse,
Error=SendRequestError,
>,
> {
到目前为止,有一些警告:
other::B
必然是未来的一种不透明的impl特征
futuresult
的第一个参数实际上可能是Void
或其他类似的参数
您链接到的第一个问题已关闭,而且显然已修复。为什么您认为它与今天的代码相关?@Shepmaster设计背景风格。我预期会收到此评论,人们可能会误解,因此我将删除。我的最终目标是为我不知道的设计开发足够的直觉不需要搜索编译器错误。查看过去的错误是如何修复的(即与预期设计不一致的行为)可以告诉我很多。我得到的印象是,这不是一个喜欢塔木德式方法的地方,所以我编辑了参考资料。我完全认为提供背景信息是合理的,但提供没有上下文的链接是没有用的。介绍链接并解释基本内容。然而,大多数人确实希望得到答案太长了,读不下去了,所以现在把代码放在上面,用复制PA来做。