36

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

例:

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)です。

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

4

3 に答える 3

54

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

も参照してください

于 2012-09-01T19:29:57.093 に答える
10

知っておく価値もあります

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

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

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

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

列をなして。確かに、2つの追加の関数オブジェクトを作成しますが、タプルも作成した可能性が高いので、それほど気にしませんね?

于 2012-09-01T20:57:33.220 に答える
9

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

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

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

これには、よりクリーンなコード(no_1と)の利点があり、とにわかりやすい_2名前を割り当てることができるため、コードが読みやすくなります。xy

于 2012-09-01T19:35:04.413 に答える