2009-09-17 9 views
28

JavaがありますScalaはメソッド定義で複数のパラメータを受け取る方法を教えてください。

public void someMethod(int ... intArray) { // question: what is the equivalent to "..." 
    // do something with intArray 
} 

どのように私はスカラ座で同じ機能を実現することができますか?つまり、定義されていない数のパラメータをメソッドに渡しますか?

+4

。 「scala varargs」を検索してみてください。 – Jesper

+1

ちょうどGoogleのために、... elipsisです – daveb

+0

私は '名前で'変数とvarargsが必要です。現在は実行できません:http:// stackoverflow。com/questions/2707186/by-name-repeated-parameters – akauppi

答えて

38
def someMethod(values : Int*) 

配列を与えます。可変引数のパラメータを最後の仮パラメータとして置きます。

+0

ありがとうございます、魅力的な作品です! – dankilman

+0

スカラーの配列ではありません。 –

48

JavaとScalaの両方にvarargsがあり、両方とも最後のパラメータに対してのみサポートされています。 this articleから

def varargTest(ints:Int*) { ints.foreach(println) } 

、差は可変引数の引数に使用されるタイプである。スカラのJava

  • SEQ(シーケンス)のため

    • 配列:それは反復することができ、などの多くの方法は、このようなコレクションはforeach、map、filter、find、...が利用可能です。

    '*'は0個以上の引数を表します。

    注:パラメータ値がすでにそのようなリストとして、シーケンスとして "パッケージ化" されている場合、それは失敗します。

    # varargTest(List(1,2,3,4,5)) 
    # //--> error: type mismatch; 
    # //--> found : List[Int] 
    # //--> required: Int 
    # //-->  varargTest(List(1,2,3,4,5)) 
    # //--> 
    

    しかし、これは通過します:

    varargTest(List(1,2,3):_*) 
        //--> 1 
        //--> 2 
        //--> 3 
    

    'を_' は型推論のためのプレースホルダショートカット。 '_*'はここでは繰り返しタイプに適用されます。 Scala Specification
    セクション4.6.2言及:

    パラメータセクションの最後の値パラメータが「*”、例えばサフィックスすることができます (..., x:T *)
    メソッド内のそのような繰り返しパラメータのタイプは、 シーケンスタイプscala.Seq[T]です。
    繰り返しパラメータを持つメソッドT*は、タイプTの可変数の引数をとります。

    (T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U, 
    

    最後の引数が_*型注釈を経由して、配列の引数であることをマークされている場合は、この規則の唯一の例外はあります。

    (e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]). 
    

    注ビス:Javaの基本となるの型消去には注意してください:これは(:変数引数の) "可変引数" と呼ばれている

    //--> error: double definition: 
    //--> method varargTest:(ints: Seq[Int])Unit and 
    //--> method varargTest:(ints: Int*)Unit at line 10 
    //--> have same type after erasure: (ints: Sequence)Unit 
    //--> def varargTest(ints:Seq[Int]) { varargTest(ints: _*) } 
    
  • +0

    あなたは私に ':_ *'の意味を教えてくれますか? – IttayD

    関連する問題