0

以下のコードでは、は の実装でstring十分長く存続しません。メソッドの内部でスコープに入り、メソッドが終了するとスコープから外れる理由を理解していますが、それへの参照を保持します。Into<Body<'a>>RequestParameters<'a>stringintoBody<'a>

少なくとも、それがstring長続きしない理由だと思います。

私が理解していないのは、このコードを構造化してstringの寿命を修正する方法です。

このコードの目的は、HashMap ( "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 に答える