タプル引数を最良の方法で渡す方法は?
例:
_def foo(...): (Int, Int) = ...
def bar(a: Int, b: Int) = ...
_
次に、foo
の出力をbar
に渡します。これは次の方法で実現できます。
_val fooResult = foo(...)
bar(fooResult._1, fooResult._2)
_
このアプローチは、特にn
- Tupleを_n > 2
_で処理する場合、少し見苦しく見えます。また、fooの結果を追加の値に格納する必要があります。そうしないと、foo
をbar(foo._1, foo._2)
を使用して複数回実行する必要があるためです。
タプルを引数として渡すより良い方法はありますか?
すべての関数で使用できる特別なtupled
メソッドがあります。
val bar2 = (bar _).tupled // or Function.tupled(bar _)
bar2
は、(Int, Int)
のタプルを取ります(bar
引数と同じ)。今あなたは言うことができます:
bar2(foo())
メソッドが実際に関数である場合(val
キーワードに注意)、構文ははるかに快適です。
val bar = (a: Int, b: Int) => //...
bar.tupled(foo())
@Tomaszが言及しているように、tupled
を使用することは良いアプローチです。
割り当て時にfoo
から返されたタプルを抽出することもできます。
val (x, y) = foo(5)
bar(x, y)
これには、よりクリーンなコードの利点があります(_1
および_2
)、およびx
とy
にわかりやすい名前を割り当てて、コードを読みやすくします。
それについても知っておく価値があります
foo(...) match { case (a,b) => bar(a,b) }
一時的なfooResult
を明示的に作成する必要がない代替手段として。スピードと乱雑さの欠如の両方が重要である場合、これは良い妥協案です。 bar _
を使用して関数を作成し、.tupled
を使用して単一のタプル引数を取るように変換できますが、これにより、ペアを呼び出すたびに2つの新しい関数オブジェクトが作成されます。結果を保存することはできますが、コードが不必要に乱雑になる可能性があります。
日常的に使用する場合(つまり、これはコードのパフォーマンスを制限する部分ではありません)、次のことができます
(bar _).tupled(foo(...))
列をなして。もちろん、2つの追加の関数オブジェクトを作成しますが、タプルも作成した可能性が高いので、気にしないでくださいthat多く、そうですか?