2011-12-20 26 views
19

は、Pythonで、このような何かすることが可能です:Scalaの同等

def blarg(): 
    return "blargidy", "blarg" 

i, j = blargh() 

をScalaで利用できる同様のものがありますか?

答えて

31

あなたはタプルを返すことができます。

def blarg = ("blargidy", "blarg") 

val (i, j) = blarg 

注パラレル変数の割り当てのためのパターンマッチング構文:これは、任意のパターンのためだけでなく、タプルのために働きます。したがって、例えば:

val list = 1 :: 2 :: 3 :: Nil 

val x :: y = list // x = 1 and y = 2 :: 3 :: Nil 
+0

素晴らしい、ありがとう! – dave

+3

これはPythonで実際に動作するのと同じです。 –

+1

@ KarlKnechtel、返される要素の数が変数の数と一致する場合のみ。それ以外の場合は、「あまりにも多くの値をアンパックする」というエラーが表示されます。これは、2番目の例のPythonで得られるものです。 – dave

6

私はこれが古い質問であることを認識していますが、これを達成する別の方法があります。私はそこに何かの欠点があるかどうかはわかりませんが、利点は、返される値が「名前付き」なので、コードを少しだけ自明にしていることです。

(Scalaの2.11でテスト)

package test.scala.misc 

object TestReturnMultipleNamedValues extends App { 

    val s = getMultipleNamedValues 

    println(s"changed=${s.dsChanged} level=${s.dsLevel}") 

    /** Returns an anonymous structure with named members. 
    * */ 
    def getMultipleNamedValues() : {val dsChanged : Boolean;val dsLevel : Int} = { 
     new { 
      val dsChanged = true 
      val dsLevel = 1 
     } 
    } 
} 
+1

または、パターンマッチングが動作するようにcaseクラスを使用する –