返回值是"未解析的名称"

时间:2015-07-20 23:57:04

标签: rust

我一直在尝试实现一个restful服务器,它在HTTP get响应中从数据库返回一些JSONed数据。我正在使用rustful箱子。到目前为止,我能够检索数据,但我无法弄清楚如何在响应正文中返回它们。

#[macro_use]
extern crate rustful;
extern crate rustc_serialize;
extern crate postgres;

use std::error::Error;

use rustful::{Server, Context, Response, TreeRouter, Log, Handler};
use rustful::context::ExtJsonBody;
use postgres::{Connection, SslMode};

#[derive(RustcEncodable,RustcDecodable)]
struct Coord {
    lat: f64,
    long: f64,
    expr: String
}

fn get(context: Context, response: Response) {
    let conn = Connection::connect("postgresql://postgres:password@localhost", &SslMode::None).unwrap();
    let stmt = conn.prepare("SELECT latitude,longitude,expiry FROM coord LIMIT 1").unwrap();
    let result = stmt.query(&[]).unwrap();
    for row in result {
       let coord = Coord {
            lat: row.get(0),
            long: row.get(1),
            expr: row.get(2)
        };
       println!("Latitude: {}\nLongitude: {}\nExpiry: {}", coord.lat, coord.long, coord.expr);
    }
    response.send(format!("{:?}", coord.lat))
}

struct HandlerFn(fn(Context, Response));

impl Handler for HandlerFn {
    fn handle_request(&self, context: Context, response: Response) {
        self.0(context, response);
    }
}

fn main() {
    let server = Server {
        host: 8080.into(),
        handlers: insert_routes! {
            TreeRouter::new() => {
                Get: HandlerFn(get)
            }
        },
        ..Server::default()
    }.run();

    match server {
        Ok(_server) => {},
        Err(e) => println!("Cannot start server: {}", e.description())
    }
}

代码目前因此错误而失败:

src/main.rs:40:35: 40:40 error: unresolved name `coord`
src/main.rs:40     response.send(format!("{:?}", coord.lat))
                                                 ^~~~~
note: in expansion of format_args!
<std macros>:2:26: 2:57 note: expansion site
<std macros>:1:1: 2:61 note: in expansion of format!
src/main.rs:40:19: 40:45 note: expansion site
error: aborting due to previous error

1 个答案:

答案 0 :(得分:4)

变量有词法范围,也就是说,变量可用的地方与源代码中的花括号相关联。这是一个小例子:

fn main() {
    {
        let value = 42;
    }
    println!("{}", value);
}

value在定义它的花括号之外无法访问。

您遇到同样的问题:

for row in result {
   let coord = Coord {...};
}
response.send(format!("{:?}", coord.lat))

创建循环的每次迭代coord,然后删除。没有任何东西与循环外的名称coord相对应。

很难告诉你如何解决问题。 docs for Response::send说(强调我的):

  

将数据发送到客户端并完成响应

这意味着您只能发送一个响应。您将不得不弄清楚如何组合所有结果,然后将它们一起发送回去。可能JSON阵列符合要求。