0

在下面的代码stringInto<Body<'a>>RequestParameters<'a>. 我理解为什么,因为在方法完成后string进入范围内into并且不再在范围内,但Body<'a>会保留对它的引用。

至少,这就是我认为string持续时间不够长的原因。

我不明白的是如何构造这段代码来修复string的生命周期。

此代码的目标是将 HashMap(例如 of "a"to "b")转换为 POST 请求正文的字符串("?a=b"例如 )。如果有更好的方法可以做到这一点,请告诉我,但我会从中受益匪浅的是了解如何解决这个终身问题。

如果我对为什么string活得不够长有误,也请告诉我。我仍在努力掌握 Rust 中的生命周期系统,因此弄清楚这一点将对我有很大帮助。

struct RequestParameters<'a> {
    map: HashMap<&'a str, &'a str>,
}

impl<'a> From<HashMap<&'a str, &'a str>> for RequestParameters<'a> {
    fn from(map: HashMap<&'a str, &'a str>) -> RequestParameters<'a> {
        RequestParameters { map: map }
    }
}

impl<'a> Into<Body<'a>> for RequestParameters<'a> {
    fn into(self) -> Body<'a> {
        let string = String::from("?") +
                     &self.map
            .iter()
            .map(|entry| format!("&{}={}", entry.0, entry.1))
            .collect::<String>()[1..];
        (&string).into()
    }
}

fn main() {
    let mut parameters = HashMap::new();
    parameters.insert("a", "b");
    let client = Client::new();
    client.post("https://google.com")
        .body(RequestParameters::from(parameters));
}
4

1 回答 1

0

正如弗拉基米尔的链接所指出的,这实际上是不可能的。我更改了我的代码以反映这些知识,现在它可以编译了。

struct RequestParameters<'a> {
    map: HashMap<&'a str, &'a str>,
}

impl<'a> From<HashMap<&'a str, &'a str>> for RequestParameters<'a> {
    fn from(map: HashMap<&'a str, &'a str>) -> RequestParameters<'a> {
        RequestParameters { map: map }
    }
}

impl<'a> RequestParameters<'a> {
    fn to_string(self) -> String {
        String::from("?") +
        &self.map.iter().map(|entry| format!("&{}={}", entry.0, entry.1)).collect::<String>()[1..]
    }
}

fn main() {
    let mut parameters = HashMap::new();
    parameters.insert("a", "b");
    let string_parameters = RequestParameters::from(parameters).to_string();
    let client = Client::new();
    client.post("https://google.com")
        .body(&string_parameters);
}

通过在制作String之前创建,Client我可以借用它的寿命比 更长Client,这解决了我的问题。

于 2016-06-05T22:25:17.300 回答