Scala эквивалентно Python, возвращающему несколько элементов - PullRequest
20 голосов
/ 20 декабря 2011

В Python можно сделать что-то вроде этого:

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

i, j = blargh()

Есть ли что-то подобное в scala?

Ответы [ 2 ]

31 голосов
/ 20 декабря 2011

Вы можете вернуть кортеж:

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
6 голосов
/ 23 января 2015

Я понимаю, что это старый вопрос, но есть и другой способ добиться того же. Я не знаю, есть ли в этом недостаток, но преимущество в том, что возвращаемые значения «именуются», что делает код немного более понятным.

(проверено на 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
        }
    }
}
...