【问题标题】:How to fix: expected concrete lifetime, but found bound lifetime parameter如何修复:预期的具体生命周期,但发现绑定生命周期参数
【发布时间】:2014-06-11 12:05:01
【问题描述】:

我目前正在努力解决这个问题。我试图将其缩小为最小的可重现示例。

struct Request;

struct ResponseWriter<'a> { 
    dummy: &'a () 
}

#[deriving(Clone)]
pub struct RouteStore{
    pub routes: Vec<Route>,
}

#[deriving(Clone)]
struct Route {
    path: String,
    handler: fn(request: &Request, response: &mut ResponseWriter)
}

impl RouteStore {
    pub fn new () -> RouteStore {
        RouteStore {
            routes: Vec::new()
        }
    }

    fn add_route (&mut self, path: String, handler: fn(request: &Request, response: &mut ResponseWriter)) -> () {
        let route = Route {
            path: path,
            handler: handler
        };
        self.routes.push(route);
    }
}

fn main () {

}

这给我留下了:

error: mismatched types: expected `fn(&http::server::request::Request, &mut http::server::response::ResponseWriter<>)` but found `fn(&http::server::request::Request, &mut http::server::response::ResponseWriter<>)` (expected concrete lifetime, but found bound lifetime parameter )
src/so.rs:12     handler: fn(request: &Request, response: &mut ResponseWriter)
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以前我将fn 存储在HashMap 中,就像这样HashMap&lt;String, fn(request: &amp;Request, response: &amp;mut ResponseWriter)&gt;。这很好用。

但现在我想稍微重构一下并引入一个Route 结构并将其存储为Vec&lt;Route&gt;。但突然间地狱爆发了,我不知道如何解决它:-/

对于好奇的人,这是我为 Rust 编写一个以 expressjs 为灵感的 Web 框架的一部分,名为 Floor

【问题讨论】:

  • 您可以尝试通过替换 http 依赖项来进一步减少它,例如struct Request;struct ResponseWriter&lt;'a&gt; { dummy: &amp;'a () }?
  • 当然,我会试试的。我还在这里推送了真正的代码,以防你好奇。 github.com/cburgdorf/Floor/blob/var_paths/src/routestore.rs 你可以运行 make floor 来解决这个问题。

标签: rust lifetime


【解决方案1】:

在使您的示例变得更简单(摆脱 http 依赖项)以及有关 IRC 的一些建议之后(即有人指出,如果您从 Route 中删除 deriving(Clone),问题就会消失) ,你可以在下面看到一个固定的版本(--cfg v2

#[deriving(Clone)]
pub struct RouteStore{
    pub routes: Vec<Route>,
}

#[cfg(v1)]
#[deriving(Clone)]
struct Route {
    path: String,
    handler: fn(response: &mut ())
}

#[cfg(v2)]
struct Route {
    path: String,
    handler: fn(response: &mut ())
}

#[cfg(v2)]
impl Clone for Route {
    fn clone(&self) -> Route {
        Route { path: self.path.clone(), handler: self.handler }
    }
}
impl RouteStore {
    pub fn new () -> RouteStore {
        RouteStore {
            routes: Vec::new()
        }
    }

    fn add_route (&mut self, path: String, handler: fn(response: &mut ())) -> () {
        let route = Route {
            path: path,
            handler: handler
        };
        self.routes.push(route);
    }
}

fn main () {

}

这里的问题是fn 没有实现Clone(编辑:嗯,它确实有一个clone 方法,但返回value 似乎与该字段需要的内容不兼容。上面的 v2 版本只是回避了整个问题。)

所以我怀疑您看到的错误来自deriving(Clone) 注入的自动生成的克隆实现。

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多