cat src/main.rs #[derive(Debug)] struct f_closure{ name: String, } impl f_closure{ fn fn_call(& self) -> String{ self.name } } fn main() { let name = String::from("kobe"); let kobe = f_closure{name:name,}; println!("name {}",kobe.fn_call()); }
[root@bogon f_closure]# cargo build Compiling own v0.1.0 (/data2/rust/f_closure) 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[E0507]: cannot move out of `self.name` which is behind a shared reference --> src/main.rs:7:4 | 7 | self.name | ^^^^^^^^^ move occurs because `self.name` has type `std::string::String`, which does not implement the `Copy` trait error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0507`.
cat src/main.rs #[derive(Debug)] struct f_closure{ name: String, } impl f_closure{ fn fn_call( self) -> String{ //不是&self self.name } } fn main() { let name = String::from("kobe"); let kobe = f_closure{name:name,}; println!("name {}",kobe.fn_call()); }
[root@bogon f_closure]# cargo build 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 warning: 1 warning emitted Finished dev [unoptimized + debuginfo] target(s) in 0.01s [root@bogon f_closure]# cargo run 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 warning: 1 warning emitted Finished dev [unoptimized + debuginfo] target(s) in 0.01s Running `target/debug/own` name kobe [root@bogon f_closure]#
cat src/main.rs #[derive(Debug)] struct f_closure{ name: String, } impl f_closure{ fn fn_call( self) -> String{ self.name } } fn main() { let name = String::from("kobe"); let kobe = f_closure{name:name,}; println!("name {}",kobe.fn_call()); println!("name {}",kobe.fn_call()); }
cargo build Compiling own v0.1.0 (/data2/rust/f_closure) 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: `kobe` --> src/main.rs:14:21 | 12 | let kobe = f_closure{name:name,}; | ---- move occurs because `kobe` has type `f_closure`, which does not implement the `Copy` trait 13 | println!("name {}",kobe.fn_call()); | --------- `kobe` moved due to this method call 14 | println!("name {}",kobe.fn_call()); | ^^^^ value used here after move | note: this function consumes the receiver `self` by taking ownership of it, which moves `kobe` --> src/main.rs:6:14 | 6 | fn fn_call( self) -> String{ | ^^^^ 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 main() { let name = String::from("kobe"); let kobe = f_closure{name:name,}; let f1= || name; println!("name {}",f1()); //println!("name {}",kobe.fn_call()); //println!("name {}",kobe.fn_call()); }
cargo build Compiling own v0.1.0 (/data2/rust/f_closure2) 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 warning: unused variable: `kobe` --> src/main.rs:12:6 | 12 | let kobe = f_closure{name:name,}; | ^^^^ help: if this is intentional, prefix it with an underscore: `_kobe` | = note: `#[warn(unused_variables)]` on by default error[E0382]: use of moved value: `name` --> src/main.rs:13:11 | 11 | let name = String::from("kobe"); | ---- move occurs because `name` has type `std::string::String`, which does not implement the `Copy` trait 12 | let kobe = f_closure{name:name,}; | ---- value moved here 13 | let f1= || name; | ^^ ---- use occurs due to use in closure | | | value used here after move error: aborting due to previous error; 2 warnings 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 main() { let name = String::from("kobe"); //let kobe = f_closure{name:name,}; let f1= || name; println!("name {}",f1()); println!("name {}",f1()); //println!("name {}",kobe.fn_call()); //println!("name {}",kobe.fn_call()); }
cargo build Compiling own v0.1.0 (/data2/rust/f_closure2) 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:15:21 | 14 | println!("name {}",f1()); | ---- `f1` moved due to this call 15 | println!("name {}",f1()); | ^^ value used here after move | note: closure cannot be invoked more than once because it moves the variable `name` out of its environment --> src/main.rs:13:14 | 13 | let f1= || name; | ^^^^ note: this value implements `FnOnce`, which causes it to be moved when called --> src/main.rs:14:21 | 14 | println!("name {}",f1()); | ^^ 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.