25

Pythonには、スター(または「*」または「アンパック」)演算子があります。これにより、位置引数を渡す際に便利なリストをアンパックできます。例えば:

range(3, 6)
args = [3, 6]
# invokes range(3, 6)
range(*args)

この特定の例では、range引数が2つしかないため、入力の手間が省けます。しかし、への引数がもっとある場合range、またはargs入力ソースから読み取られた場合、別の関数から返された場合など、これが役立つ場合があることを想像できます。

Scalaでは、同等のものを見つけることができませんでした。Scalaインタラクティブセッションで実行される次のコマンドについて考えてみます。

case class ThreeValues(one: String, two: String, three: String)

//works fine
val x = ThreeValues("1","2","3")

val argList = List("one","two","three")

//also works
val y = ThreeValues(argList(0), argList(1), argList(2))

//doesn't work, obviously
val z = ThreeValues(*argList)

で使用されている方法以外に、これを行うためのより簡潔な方法はありval yますか?

4

4 に答える 4

38

Scalaに直接相当するものはありません。最も近いのは、_*varargメソッドでのみ機能するの使用法です。例として、varargメソッドの例を次に示します。

def hello( names: String*) {
  println( "Hello " + names.mkString(" and " ) )
}

これは、任意の数の引数で使用できます。

scala> hello()
Hello
scala> hello("elwood")
Hello elwood
scala> hello("elwood", "jake")
Hello elwood and jake

ここで、文字列のリストがあり、それらをこのメソッドに渡したい場合、それを解凍する方法は次の_*とおりです。

scala> val names = List("john", "paul", "george", "ringo")
names: List[String] = List(john, paul, george, ringo)
scala> hello( names: _* )
Hello john and paul and george and ringo    
于 2013-02-22T23:09:05.870 に答える
5

あなたは形のないものを使ってPythonに向かっていくらかの方法を得ることができます、

Welcome to Scala version 2.11.0-20130208-073607-ce32c1af46 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_05).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import shapeless._
import shapeless._

scala> import Traversables._
import Traversables._

scala> case class ThreeValues(one: String, two: String, three: String)
defined class ThreeValues

scala> val argList = List("one","two","three")
argList: List[String] = List(one, two, three)

scala> argList.toHList[String :: String :: String :: HNil].map(_.tupled).map(ThreeValues.tupled)
res0: Option[ThreeValues] = Some(ThreeValues(one,two,three))

ご覧のとおり、Scalaでは形のないものでもう少し儀式が必要です。これは、shapelessが実行時に満たされることが保証されているコンパイル時の制約を課すためです(Pythonとは異なり、argsサイズが間違っているか、タイプの要素が間違っていると実行時に失敗します)...代わりに、リストに期待するタイプ(この場合は正確に3つStrings)を入力し、その期待が満たされない場合(結果が明示的にのであるため)を処理する準備をしOptionますThreeValues

于 2013-02-23T02:22:21.050 に答える
4

関数にも似たようなものがありtupledます。n個のパラメーターを受け取る関数を、n型タプルの1つの引数をとる関数に変換します。

詳細については、この質問を参照してください:scala tuple unpacking

このような配列のメソッドは、同じタイプの複数の引数を持つ関数でのみ機能するため、あまり意味がありません。

于 2013-02-22T23:07:25.087 に答える
3

リストを解凍する別の方法:

val a :: b :: c :: _ = argList
val z = ThreeValues(a, b, c)
于 2020-12-23T18:50:24.417 に答える