質問: c % 2 => action::processeven, _ => action::processodd, }; match action { action::processeven => process_even(n), action::processodd => process_odd(n), } } fn main() { process(number::constant { value: 4711 }); process(number::constant { value: 2000 }); }
回答: 試してみましたかsing n?fn process(n: number) { match n { number::constant { value: c, .. } if c % 2 == 0 => process_even(n), _ => process_odd(n) } } これは、valueがi32、つまりcopyであるために機能します。つまり、コンパイラーは、移動したり借用したりすることなく、コピーすることができます。それよりも複雑なタイプを扱っている場合は、第2段階を回避できない可能性があります。とはいえ、thatの場合でも、オプションが2つしかない場合は、trueまたはfalseを返すことができます。 or最初の一致からprocess_even/process_oddを関数ポインタとして直接返し、それを呼び出すことができます。fn process(n: number) { let action = match n { number::constant { value: c, .. } if c % 2 == 0 => process_even as fn(_), _ => process_odd }; action(n) }