How do I fix the problem of cannot bind by-move into a pattern guard [E0008] on s?
let res = match Some("hi".to_string()) { Some(s) if s.len() == 0 => 1, _ => 3 }; Is there anyway of changing it without putting the condition in the arm?
In this case, you can bind by reference:
let res = match Some("hi".to_string()) { Some(ref s) if s.len() == 0 => 1, _ => 3 }; The general problem here is that binding by move must disallow further uses of the original variable, as moving out invalidates the data. If the guard is false, then the original variable needs to be used to match against the later patterns, which is illegal due to the move.
For example:
fn f(x: Option<String>) { match x { Some(a) if { drop(a); false } => println!("impossible"), Some(b) => println!("whoops, {}", b), None => println!("none"), } } If x is Some, the internal String is moved out and deallocated when deciding if a arm should be taken, but that same String is immediately used again for the b arm once the a arm is rejected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With