几年来,我一直把Rust 作为一种爱好.就在我以为我开始理解生命的时候,我发现了这个.我试图"泛化"一个函数来处理不同类型的数据.以下是我的问题的MRE.
pub struct BorrowedData<'data> {
inner: Vec<&'data u16>
}
struct ConcreteData {
data: Vec<u16>
}
impl TryFrom<BorrowedData<'_>> for ConcreteData {
type Error = ();
fn try_from(value: BorrowedData<'_>) -> Result<Self, Self::Error> {
Ok(Self {
data: value.inner.into_iter().map(|n| *n).collect()
})
}
}
pub fn test_generic<'data,Entity: TryFrom<BorrowedData<'data>,Error=()>>() -> Result<(),()> {
let data = [4,8,15,16,23,42];
let borrowed = BorrowedData {
inner: data.iter().collect()
};
let _data = Entity::try_from(borrowed)?;
// ...Process and save data to file in appropriate structure
Ok(())
} // data dropped here while still borrowed?
pub fn test_concrete() -> Result<(),()> {
let data = [4,8,15,16,23,42];
let borrowed = BorrowedData {
inner: data.iter().collect()
};
let _data = ConcreteData::try_from(borrowed)?;
// ...Process and save data to file in appropriate structure
Ok(())
}
这将返回编译错误:
error[E0597]: `data` does not live long enough
--> src/mre.rs:26:16
|
21 | pub fn test_generic<'data,Entity: TryFrom<BorrowedData<'data>,Error=()>>() -> Result<(),()> {
| ----- lifetime `'data` defined here
...
26 | inner: data.iter().collect()
| ^^^^^^^^^^^ borrowed value does not live long enough
...
29 | let _data = Entity::try_from(borrowed)?;
| -------------------------- argument requires that `data` is borrowed for `'data`
...
35 | } // data dropped here while still borrowed?
| - `data` dropped here while still borrowed
它在具体函数中工作得很好,但泛型函数会带来问题.
有谁能解释一下这个吗?
有没有办法修复test_generic
的功能?*或者这是不可能的?
*不接触data
变量或BorrowedData
struct .后者是对从外部c库调用返回的对象的模拟,前者是因为它是我重现错误的唯一方法.这是我在我的真实代码中得到的错误.