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
}