在下面的代码中,string
在Into<Body<'a>>
的{{1}}实施中的活动时间不够长。我理解为什么,因为RequestParameters<'a>
进入string
范围内,并且在方法完成后不再在范围内,但into
会保留对它的引用。
至少,这就是为什么我认为Body<'a>
的持续时间不够长。
我不明白的是如何构造此代码来修复string
的生命周期。
此代码的目标是将HashMap(例如string
到"a"
)转换为POST请求正文的字符串(例如"b"
)。如果有更好的方法来做到这一点,请告诉我,但是我将从中获益很多是了解如何解决这个终身问题。
如果我错误地说"?a=b"
为什么活得不够久,请告诉我。我还在努力解决Rust中的终生系统问题,所以搞清楚这一点对我来说有点帮助。
string
答案 0 :(得分: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
更长,这可以解决我的问题。