web-dev-qa-db-ja.com

タプル引数を最良の方法で渡す方法は?

タプル引数を最良の方法で渡す方法は?

例:

_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の結果を追加の値に格納する必要があります。そうしないと、foobar(foo._1, foo._2)を使用して複数回実行する必要があるためです。

タプルを引数として渡すより良い方法はありますか?

35
John Threepwood

すべての関数で使用できる特別な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())

こちらもご覧ください

52

@Tomaszが言及しているように、tupledを使用することは良いアプローチです。

割り当て時にfooから返されたタプルを抽出することもできます。

val (x, y) = foo(5)
bar(x, y)

これには、よりクリーンなコードの利点があります(_1および_2)、およびxyにわかりやすい名前を割り当てて、コードを読みやすくします。

9
dhg

それについても知っておく価値があります

foo(...) match { case (a,b) => bar(a,b) }

一時的なfooResultを明示的に作成する必要がない代替手段として。スピードと乱雑さの欠如の両方が重要である場合、これは良い妥協案です。 bar _を使用して関数を作成し、.tupledを使用して単一のタプル引数を取るように変換できますが、これにより、ペアを呼び出すたびに2つの新しい関数オブジェクトが作成されます。結果を保存することはできますが、コードが不必要に乱雑になる可能性があります。

日常的に使用する場合(つまり、これはコードのパフォーマンスを制限する部分ではありません)、次のことができます

(bar _).tupled(foo(...))

列をなして。もちろん、2つの追加の関数オブジェクトを作成しますが、タプルも作成した可能性が高いので、気にしないでくださいthat多く、そうですか?

9
Rex Kerr