Scala 像 javascript 对象一样解构

and*_*ais 1 javascript scala

我想要javascripts在scala中解构的能力。考虑 js 中的一个对象和 scala 中的一个 case 类。如果我只想要对象/案例类的第一个和最后一个属性,那么在 Scala 中我需要列出所有属性,否则我会收到编译错误。

在 Scala 案例类解构(据我所知)是使用unapply方法定位的

case class ABC(a: Int, b: Int, c: Int)
val obj = ABC(1,2,3)
// deconstruction
val (a, _, c) = obj
Run Code Online (Sandbox Code Playgroud)

而在javascript中它的属性名称

const obj = { a: 1, b: 2, c: 3 }
const { a, c } = obj
// or
const { a: attrA, c: attrC } = obj
// scala deconstruction is essentially javascript array deconstruction
const arr = [1,2,3]
const [ first, _, last ] = arr
Run Code Online (Sandbox Code Playgroud)

是否可以在 Scala 中使用“类似 javascript”的对象解构?在这个例子中差别很小,但是随着更多的属性可能会在未来的修订中改变顺序,scala 代码变得更难管理。

And*_*kin 5

如果我错了,请纠正我,但据我所知,

const {a, c} = obj
Run Code Online (Sandbox Code Playgroud)

简单带来的价值obj.a,并obj.c以商品名ac进入的范围。如果模式匹配过于冗长,您可以使用 轻松实现类似的效果import,例如:

case class Abc(a: Int, b: Int, c: Int)
val obj = Abc(1, 2, 3)
val somethingUsingOnlyAandC = {
  import obj.{a, c}
  a + c
}

println(somethingUsingOnlyAandC) // Output: 4
Run Code Online (Sandbox Code Playgroud)

如果您有重命名导入的同一类的多个对象,这也适用:

case class Abc(a: Int, b: Int, c: Int)

val x = Abc(1, 2, 3)
val y = Abc(4, 5, 6)

val bar = {
  import x.{a => a1, c => c1}
  import y.{a => a2, c => c2}
  a1 * a2 + c1 * c2
}

println(bar) // prints "22", 1 * 4 + 3 * 6
Run Code Online (Sandbox Code Playgroud)