Rom*_*per 2 scala destructuring
最初我们有一个类似的代码
class Person(firstName: String, lastName: String)
val (firstName, lastName) = person
Run Code Online (Sandbox Code Playgroud)
有人交换领域
class Person(lastName: String, firstName: String)
val (firstName, lastName) = person
Run Code Online (Sandbox Code Playgroud)
编译器很高兴!
编译器无法知道您交换了字段的顺序,因为分析不会查找参数名称.只要typer类型检查,一切都很好.你可以做的是额外的类型:
case class FirstName(name: String)
case class LastName(name: String)
class Person(firstName: FirstName, lastName: LastName)
Run Code Online (Sandbox Code Playgroud)
现在交换类型将导致编译时错误.
如果您不希望分配其他对象的额外开销,请查看无形标记类型:
import shapeless.tag.@@
trait FirstNameTag
trait LastNameTag
type FirstName = String @@ FirstNameTag
type LastName = String @@ LastNameTag
case class Person(fn: FirstName, ln: LastName)
Run Code Online (Sandbox Code Playgroud)
现在:
import shapeless.tag
val firstName: FirstName = tag[FirstNameTag][String]("yuv")
val lastName: LastName = tag[LastName][String]("itz")
val person = Person(firstName, lastName)
Run Code Online (Sandbox Code Playgroud)
或者@Ren指出使用价值类:
case class FirstName(name: String) extends AnyVal
case class LastName(name: String) extends AnyVal
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |