私は Rust でさまざまなパターンを試しており、署名が似ているが引数の数が異なるいくつかの関数の 1 つを動的に呼び出したいと考えていました。例えば:
fn foo(x: i32) -> i32 { x }
fn bar(x1: i32, x2: i32) -> i32 { x1 + x2 }
fn baz(x1: i32, x2: i32, x3: i32) -> i32 { x1 + x2 + x3 }
これらのメソッドにすべてのパラメーターの値を渡して、それらを交換可能に呼び出すこと5
ができるようにしたいと考えています。foo(5)
bar(5, 5)
baz(5, 5, 5)
これは、マクロまたはその他の構文拡張によって行うのが最善のようですが、それを表現する最良の方法はわかりません。私がこれまでに持っているのは、ケースの単なる力ずくの列挙ですが、これは面倒 (すべてのケースで同じ式を書き直すこと) と脆弱 (n+1 個の引数をサポートしていない) の両方のようです。
// Takes a function and an expected number of args and returns a closure that
// takes exactly one arg and passes it n times to the given function.
macro_rules! expand {
($func:ident, 0) => { Box::new(|_n: i32| $func()) };
($func:ident, 1) => { Box::new(|n: i32| $func(n)) };
($func:ident, 2) => { Box::new(|n: i32| $func(n, n)) };
($func:ident, 3) => { Box::new(|n: i32| $func(n, n, n)) };
}
似ているように見えるこのパターンに出くわしましたが、それでも各ケースを個別に列挙する必要があります。
fn(X, ...)
厳密に 1 つを取る関数として aをより柔軟にラップできるより良いアプローチはありX
ますか?