2011-10-29 14 views
39

、私はList[Event]持っているとQueue[Event]にそれをコピーしたいのですが、次の構文ではなくQueue[List[Event]]が得られます。何らかの理由で、以下の作品についてはScalaではparam:_ *の意味は何ですか?スカラ座(2.9.1)に新しいビーイング

val eventQueue = Queue(events) 

val eventQueue = Queue(events : _*) 

しかし、私はそれが何をしているのか理解したいと思います。私はすでにQueue.apply関数のシグネチャを見て:

def apply[A](elems: A*) 

そして、最初の試行が動作しない理由を私は理解しますが、二番目の意味は何ですか?この場合、:と、_*とは何ですか、なぜapply関数はIterable[A]になりますか?

答えて

40

a: Aは型帰属; What is the purpose of type ascriptions in Scala?

は、コンパイラがシーケンスタイプの単一の引数を可変引数シーケンス、つまりvarargsとして扱うように指示する特殊型のascriptionのインスタンスです。

Queue.applyを使用してQueueを作成することは完全に有効です。これは、シーケンスまたは繰り返し可能な要素を1つ持っているため、単一の文字をIterable[A]に与えるとまったく起こります。 Pythonの人々のために

+1

私はタイプのascriptionを指してくれてありがとう! – Chris

34

これは、コンパイラにすべての要素を単一の引数として渡すのではなく、独自の引数として渡すようにコンパイラに指示する特殊な表記法です。 hereを参照してください。

シーケンス引数を示すタイプ注釈であり、言語仕様「繰り返しパラメータ」のセクション4.6.2の一般ルールの「例外」として言及されています。

これは、関数が可変数の引数をとる場合に便利です。あなたは、このようなxs = List(1,2,3)としてリストを持っている場合、それはListいうよりIntあるので、あなたが、xs自体を渡すことはできませんが、あなたが使用してその要素を渡すことができsum(1)sum(1,2)などとして呼び出すことができるようにdef sum(args: Int*)としての機能、 sum(xs: _*)

+3

また素晴らしい答え、感謝& – Chris

+0

'デフ和(XS:_ *)をupvote' 'エラー:未結合のワイルドカードタイプ' スロー – 7kemZmani

+0

あなたの答えは明確であるが、しかし、これは実際には私にとってはより多くの混乱を招いています。通常はスカラーです。xs:intはxsの型がintであることを意味します。これは上記のscalaの構文で、xs:_ *はxsが個々のメンバーにキャストされることを意味します。 – Rpant

0

Scalaの_*オペレータはPythonの*-operatorの多かれ少なかれ同等です。パイソンの

def echo(args: String*) = 
    for (arg <- args) println(arg) 

val arr = Array("What's", "up", "doc?") 
echo(arr: _*) 

は次のようになり:

def echo(*args): 
    for arg in args: 
     print "%s" % arg 

arr = ["What's", "up", "doc?"] 
echo(*arr) 

との両方がfollowinを与えるLuigi Plingeによって提供linkからScalaの例を変換


G出力:


What's
up
doc?

差:アンパック位置パラメータ

Pythonの*演算子はまた、固定アリティ関数の位置パラメータ/パラメータのアンパックに対処することができるが:

def multiply (x, y): 
    return x * y 

operands = (2, 4) 
multiply(*operands) 

8

D Scalaのと同じことをoing:

not enough arguments for method multiply: (x: Int, y: Int)Int.
Unspecified value parameter y.

をしかし、Scalaのと同じことを達成することが可能である:

def multiply(x:Int, y:Int) = { 
    x * y; 
} 

val operands = (2, 4) 
multiply (operands : _*) 

は失敗します

def multiply(x:Int, y:Int) = { 
    x*y; 
} 

val operands = (2, 4) 
multiply _ tupled operands 

Lorrin Nelsonによると、それがどのように動作するか、これは次のとおりです。

The first part, f _, is the syntax for a partially applied function in which none of the arguments have been specified. This works as a mechanism to get a hold of the function object. tupled returns a new function which of arity-1 that takes a single arity-n tuple.

Futher読み:

関連する問題