Rust 是否可以延长本地借用内存块的生存期以匹配声明的生存期?

Rust 是否可以延长本地借用内存块的生存期以匹配声明的生存期?,rust,lifetime,Rust,Lifetime,我意识到这可能是一个重复的问题,但我无法找到一个满意的答案 比如说,我在本地借用了一些东西,并尝试将其用于具有声明生命周期的东西: extern crate serde; extern crate serde_json; use serde::Deserialize; pub trait Item: {} fn transform<'de, ITM: Deserialize<'de> + Item>(item_json: String) -> ITM {

我意识到这可能是一个重复的问题,但我无法找到一个满意的答案

比如说,我在本地借用了一些东西,并尝试将其用于具有声明生命周期的东西:

extern crate serde;
extern crate serde_json;

use serde::Deserialize;

pub trait Item: {}

fn transform<'de, ITM: Deserialize<'de> + Item>(item_json: String) -> ITM {
    let item_typed: ITM = ::serde_json::from_str(&item_json).unwrap();
    item_typed
}
可以理解

好的,但是如何解决这个问题呢

更改函数的签名,使其使用lifetimed&str,这只会让您大吃一惊:

fn transform_str<'de, ITM: Deserialize<'de> + Item + Clone>(item_json: &'de str) -> ITM {
    ::serde_json::from_str(item_json).unwrap()
}
fn transform<'de, ITM: Deserialize<'de> + Item>(item_json: String) -> ITM {
    transform_str(&item_json)  //error
}
fn transform\u str+Item+Clone>(Item\u json:&'de str)->ITM{
::serde_json::from_str(item_json).unwrap()
}
fn transform+Item>(Item_json:String)->ITM{
transform\u str(&item\u json)//错误
}

我想你需要
+Item>
而不是
+Item>
。另请参见。@SvenMarnach-是的,就是这样。排名较高的边界起了作用。如果你添加了一个答案,我会将其标记为已接受,这样你就可以获得积分(尽管看起来你并不需要分数:)Shepmaster找到了一个更好的答案——请务必在那里查看dtolnay的答案。
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
where
    T: de::Deserialize<'a>, {
    from_trait(read::StrRead::new(s))
}
fn transform_str<'de, ITM: Deserialize<'de> + Item + Clone>(item_json: &'de str) -> ITM {
    ::serde_json::from_str(item_json).unwrap()
}
fn transform<'de, ITM: Deserialize<'de> + Item>(item_json: String) -> ITM {
    transform_str(&item_json)  //error
}