官术网_书友最值得收藏!

Products can report the names of their element

This feature probably will be mostly useful for the case classes as it makes possible some generic programming without the need to resort to reflection or macros. 

The following examples demonstrate how the new productElementName(idx) method can be used to build a naive JSON serializer for simple case classes:

case class User(name: String, surname: String, email: String)

def naiveToJsonString(p: Product): String =
(for { i <- 0 until p.productArity } yield
s""""${p.productElementName(i)}": "${p.productElement(i)}"""")
.mkString("{ ", ", ", " }")

Obviously, this simple iteration does not take nesting and escaping into account, but it already can produce valid results in elementary cases:

scala> val user = User("John", "Doe", "jd@mail.me")
user: User = User(John,Doe,jd@mail.me)
scala> naiveToJsonString(user)
res1: String = { "name": "John", "surname": "Doe", "email": "jd@mail.me" }

Unfortunately, the method taking an index of the element throws an exception in the case that the index is invalid:

scala> user.productElementName(3)
java.lang.IndexOutOfBoundsException: 3
at User.productElementName(<console>:1)
... 38 elided

We will discuss why throwing exceptions is not the best approach, as well as viable alternatives, in Chapter 6, Exploring Built-In Effects.

主站蜘蛛池模板: 威海市| 丰镇市| 曲靖市| 藁城市| 高安市| 宜都市| 成都市| 乐昌市| 抚州市| 微博| 柏乡县| 思南县| 阿城市| 桓台县| 三门县| 鄯善县| 阜城县| 夹江县| 友谊县| 阿坝县| 宜兴市| 开远市| 黄山市| 邹城市| 凤阳县| 宜城市| 双流县| 鄯善县| 远安县| 长沙市| 桑日县| 城固县| 乌海市| 南靖县| 郎溪县| 乐安县| 淮南市| 克什克腾旗| 蓬安县| 饶平县| 万源市|