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

  • Learn Scala Programming
  • Slava Schmidt
  • 150字
  • 2021-06-10 19:35:39

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.

主站蜘蛛池模板: 岳池县| 长丰县| 平乐县| 泰州市| 毕节市| 靖远县| 开封县| 井研县| 托克逊县| 民权县| 师宗县| 专栏| 平阳县| 民县| 中方县| 惠来县| 高邑县| 棋牌| 鄂托克前旗| 灵宝市| 孟连| 九台市| 朝阳市| 游戏| 安塞县| 金平| 连州市| 泰州市| 南郑县| 孟州市| 儋州市| 独山县| 固阳县| 澜沧| 许昌市| 涟源市| 晋州市| 监利县| 怀柔区| 云霄县| 靖边县|