如何从列表中解压缩项目?

use*_*774 2 scala

我试图将一个项目从一个List单独val的"解包" 到另外4个单独的s中

def myFunc(myList: List[Int]): Unit = {
    val (w,x,y,z) = myList
    // Compile error
}
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我会收到以下错误:

Error:(16, 9) constructor cannot be instantiated to expected type;
 found   : (T1, T2, T3, T4)
 required: List[Int]
    val (w, x, y, z) = myList
        ^
Run Code Online (Sandbox Code Playgroud)

因此,看起来编译器无法推断出来的所有内容List[Int]实际上仍然Int是s.有没有办法参数化这样的作业?

Ele*_*fee 7

除了Ionut的答案,你也可以这样做:

scala> val List(a, b, c, d) = List(1, 2, 3, 4)
a: Int = 1
b: Int = 2
c: Int = 3
d: Int = 4
Run Code Online (Sandbox Code Playgroud)

这可能更符合您在开始时尝试的内容

如果列表长于所需的元素数,您也可以这样做:

scala> val List(a, b, c, rest @ _*) = List(1, 2, 3, 4, 5, 6)
a: Int = 1
b: Int = 2
c: Int = 3
rest: Seq[Int] = List(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)


Ion*_*tan 5

问题是您正在尝试使用 4 元组提取器对列表进行模式匹配。试试这个:

scala> val a :: b :: c :: d :: rest = List(1, 2, 3, 4, 5, 6, 7)
a: Int = 1
b: Int = 2
c: Int = 3
d: Int = 4
rest: List[Int] = List(5, 6, 7)

scala> val (a, b, c, d) = (1, 2, 3, 4)
a: Int = 1
b: Int = 2
c: Int = 3
d: Int = 4
Run Code Online (Sandbox Code Playgroud)