Я написал функцию save
, которая принимает функцию в качестве параметра:
fn save(method:&dyn Fn(&'static str)) {
method("Hello world");
}
fn print(string:&'static str) {
println!("{}", string);
}
fn main() {
save(&print)
}
Это прекрасно работает! Но теперь я хочу проверить save
. Лучший способ сделать это - использовать FnMut
:
fn save(method: &mut dyn FnMut(&'static str)) {
method("Hello world");
}
fn print(string: &'static str) {
println!("{}", string);
}
fn main() {
save(&mut print)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn save_test() {
let actual = {
let mut actual = String::new();
let mut method = |string: &'static str| {
actual = format!("{}{}", actual, string);
};
save(&mut method);
save(&mut method);
actual
};
let expected = "Hello worldHello world".to_string();
assert_eq!(actual, expected);
}
}
Это все еще работает и выполняет все, что я хочу! Но теперь я должен использовать изменяемые ссылки всякий раз, когда я call
сохраняю. Хотя это не влияет на функциональность, оно запутывает код. Есть ли лучший способ достичь sh того же результата?