我想要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 代码变得更难管理。
如果我错了,请纠正我,但据我所知,
const {a, c} = obj
Run Code Online (Sandbox Code Playgroud)
简单带来的价值obj.a,并obj.c以商品名a和c进入的范围。如果模式匹配过于冗长,您可以使用 轻松实现类似的效果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)