我有一个HashMap
函数字符串。据我了解,这&dyn Fn(&str) -> bool
是必要的,因为我想同时使用函数和闭包,但是我收到了这个编译错误:
error[E0716]: temporary value dropped while borrowed
--> src/test.rs:22:26
|
22 | checks.insert("k3", &|i| cached_regex.is_match(i));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
...
27 | match checks.get(kvp[0]) {
| ------ borrow later used here
|
= note: consider using a `let` binding to create a longer lived value
示例代码:
use regex::Regex;
use std::collections::HashMap;
fn main() {
assert_eq!(run_checks("k1:test, k3:1234"), true);
assert_eq!(run_checks("k1:test, k3:12345"), false);
assert_eq!(run_checks("k1:test, k2:test2"), true);
}
fn specific_check(i: &str) -> bool { i == "test" }
fn run_checks(input: &str) -> bool {
let cached_regex = Regex::new(r"^\d{4}$").unwrap();
let mut checks: HashMap<&str, &dyn Fn(&str) -> bool> = HashMap::new();
checks.insert("k1", &specific_check);
checks.insert("k2", &|i| i == "test2");
// Not working
checks.insert("k3", &|i| cached_regex.is_match(i));
for kvp_pair in input.split(",") {
let kvp: Vec<&str> = kvp_pair.trim().split(":").collect();
match checks.get(kvp[0]) {
Some(check) => {
if !check(kvp[1]) {
return false;
}
}
None => return false,
}
}
true
}