Ich versuche, eine Rust-Funktion zu schreiben, die eine Regex und eine Zeichenfolge/str und eine HashMap
aller genannten Captures in dieser Regex zurückgibt. Hier ist der Code:Regex-Captures leben nicht so lange, wie ich denke, sie sollten
use std::collections::HashMap;
use regex::Regex;
fn get_matches<'a>(line: &'a str, re: &Regex) -> HashMap<&'a str, &'a str> {
let mut results = HashMap::new();
match re.captures(line) {
None => { return results; },
Some(caps) => {
for (name, value) in caps.iter_named() {
if let Some(value) = value {
results.insert(name, value);
}
}
}
}
results
}
Und ich bekomme diesen Compiler-Fehler (Rust 1.9.0):
error: `caps` does not live long enough
for (name, value) in caps.iter_named() {
^~~~
note: reference must be valid for the lifetime 'a as defined on the block at 6:79...
fn get_matches<'a>(line: &'a str, re: &Regex) -> HashMap<&'a str, &'a str> {
let mut results = HashMap::new();
match re.captures(line) {
None => { return results; },
Some(caps) => {
...
note: ...but borrowed value is only valid for the match at 9:8
match re.captures(line) {
None => { return results; },
Some(caps) => {
for (name, value) in caps.iter_named() {
if let Some(value) = value {
results.insert(name, value);
...
Allerdings verstehe ich nicht. regex::Regex::captures
return value has a lifetime of 't
, which is the same lifetime as the string, in diesem Fall, das heißt 'a'
die regex::Captures::iter_named
returned value also has the same lifetime of 't
, die 'a
ist in diesem Fall, und das bedeutet, die auch (name, value)
for that thing't
sein soll, die in diesem Fall 'a
ist.
Meine Funktionsdefinition hat eine HashMap
, die diese 'a
Lebensdauer verwendet, sollte also nicht alles Just Work (tm)? Ich denke, ich verstehe, warum Sie eine lokale Variable nicht verwenden können, es sei denn, Sie geben es zurück, aber in diesem Fall verwende ich Referenzen, die lange genug leben sollten, oder?
Ich nehme an, ich könnte .clone()
alles zu String
, aber ich bin gespannt, ob ich dies mit nur Referenzen schreiben kann. Soll das nicht effizienter sein? Ich bin ein wenig neu in Rust, also versuche ich, Dinge zu verbessern und Dinge richtig zu machen.
> 'regex :: Captures :: iter_named' benötigt auch ein' & 't self ', dh' & caps' müssen lebenslange '' t' (' 'a') haben. Aber [die 'Captures'-Funktion] (https://doc.rust-lang.org/regex/regex/struct.Regex.html#method.captures) sollte etwas mit einer Lebensdauer von 't' zurückgeben, oder? – Rory
@Rory Ich aktualisierte die Antwort. – malbarbo
Sie haben vielleicht meine Antwort zu Lebenszeiten nicht beantwortet, aber Sie haben das zugrunde liegende Problem gelöst. :) – Rory