[root@bogon fnmut]# cat src/main.rs #[derive(Debug)] struct f_closure{ name: String, } impl f_closure{ fn fn_call( self) -> String{ self.name } } fn get_string<T>(name: String , mut f: T) -> String where T : FnMut(String) -> String{ f(name) } fn main() { let mut name = String::from("kobe"); let f1= |x : String | -> String { name.push_str("24"); format!("{}+ {}",x, name) }; let name2 = String::from("dirk"); println!("name2 {}",get_string(name2, f1)); let name3 = String::from("lakers "); println!("name2 {}",get_string(name3, f1)); }
[root@bogon fnmut]# cargo build Compiling own v0.1.0 (/data2/rust/fnmut) warning: type `f_closure` should have an upper camel case name --> src/main.rs:2:8 | 2 | struct f_closure{ | ^^^^^^^^^ help: convert the identifier to upper camel case: `FClosure` | = note: `#[warn(non_camel_case_types)]` on by default error[E0382]: use of moved value: `f1` --> src/main.rs:22:40 | 20 | println!("name2 {}",get_string(name2, f1)); | -- value moved here 21 | let name3 = String::from("lakers "); 22 | println!("name2 {}",get_string(name3, f1)); | ^^ value used here after move | note: closure cannot be moved more than once as it is not `Copy` due to moving the variable `name` out of its environment --> src/main.rs:16:7 | 16 | name.push_str("24"); | ^^^^ error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0382`. error: could not compile `own`. To learn more, run the command again with --verbose.
cat src/main.rs #[derive(Debug)] struct f_closure{ name: String, } impl f_closure{ fn fn_call( self) -> String{ self.name } } fn get_string<T>(name: String , mut f: T) -> String where T : FnMut(String) -> String{ f(name) } fn main() { let mut name = String::from("kobe"); let f1= |x : String | -> String { name.push_str("24"); format!("{}+ {}",x, name) }; let name2 = String::from("dirk"); println!("name2 {}",get_string(name2, f1)); //let name3 = String::from("lakers "); //println!("name2 {}",get_string(name3, f1)); }