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