Rust 如何使用泛型参数包装函数,这些参数使用';静态寿命

Rust 如何使用泛型参数包装函数,这些参数使用';静态寿命,rust,rust-lifetimes,Rust,Rust Lifetimes,我正在从事一个更大的私人项目,并为要使用的钩子引入了类似于函数注册表的东西。到目前为止,这一切都很好,直到我被迫使用一个具有命名生存期的类型,在我的例子中,它是rusqlite::Transaction如果可行的话,一个简单的选择是使用Holder,但是f:fn(&T)(和exe:fn(&self,&T): struct Holder{ 项目:fn(&T)->(), } impl支架{ fn新(f:fn(&T))->支架{ 持有人{项目:f} } fn exe(&self,i:&T){ 设f=s

我正在从事一个更大的私人项目,并为要使用的钩子引入了类似于函数注册表的东西。到目前为止,这一切都很好,直到我被迫使用一个具有命名生存期的类型,在我的例子中,它是
rusqlite::Transaction如果可行的话,一个简单的选择是使用
Holder
,但是
f:fn(&T)
(和
exe:fn(&self,&T)

struct Holder{
项目:fn(&T)->(),
}
impl支架{
fn新(f:fn(&T))->支架{
持有人{项目:f}
}
fn exe(&self,i:&T){
设f=self.item;
f(i);
}
}

这样,
i
的生存期与生存期(如果有)分开当然,这假设你的钩子可以在引用上一直工作,这就足够了。

非常感谢!我想知道为什么,但它对我的示例有效。不幸的是,我的项目仍然存在一些类似的问题,我现在正在调查,到底是什么问题。尝试再次创建一个失败的示例。正如Masklin正确指出的那样,我的示例通过简单地在函数签名中引入引用而得以解决。我花了一些时间才发现,只要我使用像
String
这样的真实对象作为连接而不是简单的
&str
,我的问题就会再次出现。请不要彻底改变当你遇到一个新问题时,你的问题。最好是接受帮助你的东西,用新问题创造一个全新的问题。(你现在所做的让Masklins的答案看起来像是一个非答案,因为它无法解决当前问题,而且代码与你问题中的代码相同——我浪费了一段时间试图找出它们之间的细微差别)谢谢Michael。你说得绝对正确。我把这个问题改回去,问了另一个问题。
use std::error::Error;

struct Holder<T> {
    item: fn(T) -> (),
}

impl <T> Holder<T> {
    fn new(f: fn(T) -> ()) -> Holder<T>{
        Holder{item: f}
    }

    fn exe(&self,i: T){
        let f = self.item;
        f(i);
    }
}

struct Transaction<'c> {
    connection: &'c str,
}

impl <'c> Transaction<'c> {
    fn new(c: &'c str) -> Transaction {
        Transaction{connection: c}
    }
}

fn doSomething(t: &Transaction) {
    println!("I have done Something with {}",&t.connection);
}

pub fn main() -> Result<(), Box<dyn Error>> {

    let h: Holder<&Transaction> = Holder::new(doSomething) ;
    {
        let connection = "c1";
        let tran = Transaction::new(&connection);
        h.exe(&tran);
        h.exe(&tran);
        doSomething(&tran);
        doSomething(&tran);
    }
    {
        let connection = "c2";
        let tran = Transaction::new(&connection);
        h.exe(&tran);
        h.exe(&tran);
        doSomething(&tran);
        doSomething(&tran);
    }

    Ok(())
}
error[E0597]: `tran` does not live long enough
  --> src\t.rs:39:15
   |
   |               ^^^^^ borrowed value does not live long enough
40 |         h.exe(&tran);
41 |     }
   |     - `tran` dropped here while still borrowed
...
45 |         h.exe(&tran);
   |         - borrow later used here