当前位置: 首页 > 面试题库 >

创建案例类的写作和格式

莫飞翮
2023-03-14
问题内容

对于此案例类:

case class People(names: Set[Int])

特拉维斯·布朗(Travis Brown)解释了如何创建PeopleReads:Reads[People]此答案:

implicit val PeopleReads = 
       (__ \ "names").read[Set[Id]].map(People)

但是,我正在尝试实现PeopleWrites: Writes[People]

 implicit val PeopleWrites: Writes[People] = 
    (JsPath \  "names").write[Set[Int]].map(unlift(x => Some((x.names)))

出现以下编译时错误:

scala> People( Set(1,2,3))
res5: People = People(Set(1, 2, 3))

scala>  implicit val PeopleWrites: Writes[People] = 
      (JsPath \  "names").write[Set[Int]].map(unlift(x => Some((x.names))))
<console>:21: error: value map is not a member of 
                play.api.libs.json.OWrites[Set[Int]]
              implicit val PeopleWrites: Writes[People] = 
                (JsPath \  "names").write[Set[Int]].
                                      map(unlift(x => Some((x.names)))

如何解决此错误?

另外,我怎么写我Format[People]在哪里得到/定义了ReadsWrites

val peopleFormat: Format[People] = ...


问题答案:

好问题!您不能使用的原因map是因为Writes它不是函子。

您可以将其Writes[A]视为类似A => JsValue。但是,假设我有一个A => JsValue和一个A => B。尝试想出一些方法来构成这些函数以获得一个B => JsValue—这是不可能的。

Reads[A]另一方面,有点像JsValue => A,并且是一个函子-它具有一种map方法,该方法采用a A => B并将其与Reads[A]/ 组成JsValue => A并返回Reads[B]/ JsValue => B

Writes但是,它是一个 协变
函子,幸运的是Play知道这一点。当F是逆函子时,F[A]有一个方法contramap[B](f: B => A)代替了通常的方法map[B](f: A => B)。所以你可以这样写:

case class People(names: Set[Int])

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val PeopleWrites: Writes[People] =
  (__ \ 'names).write[Set[Int]].contramap(_.names)

(__ \ 'names).write[Set[Int]]是一个Writes[Set[Int]]并且(_.names)是一个函数People => Set[Int]。与他们结合在一起contramap给我们一个Writes[People]



 类似资料:
  • 本文向大家介绍Python中类的创建和实例化操作示例,包括了Python中类的创建和实例化操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中类的创建和实例化操作。分享给大家供大家参考,具体如下: python中同样使用关键字class创建一个类,类名称第一个字母大写,可以带括号也可以不带括号; python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化

  • 虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有。 本讲就要简单多了,尝试走一个类的流程。 **说明:**关于类的这部分,我参考了《Learning Python》一书的讲解。 创建类 创建类的方法比较简单,如下: class Person: 注意,类的名称一般用大写字母开头,这是惯例。当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自

  • 我想让罗做出回应 我写了一个隐式的json格式 但对于第二行,我有三个错误 错误:(8,25)推断的类型参数[Seq[DAO.Category], Seq[DAO.Category]]不符合方法jsonFormat1的类型参数边界[P1, T 错误:(8,40)类型不匹配;找到:Seq[DAO.Category]= 错误:(8, 36) 找不到 spray.json.json.DefaultJso

  • 本文向大家介绍JS创建对象的写法示例,包括了JS创建对象的写法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS创建对象的写法。分享给大家供大家参考,具体如下: 写法1: URL HASH: 我们通过绑定hashchange事件,当点击连接时可以实现使用ajax实现无刷新跳转。 更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaS

  • 本文向大家介绍基于springboot2集成jpa,创建dao的案例,包括了基于springboot2集成jpa,创建dao的案例的使用技巧和注意事项,需要的朋友参考一下 springboot中集成jpa需要再pom文件中添加jpa的jar包,使用springboot的话iju不用自己规定版本号了,自动管理依赖版本即可。 然后我们再添加hibernate和oracle的jar包,同样自动管理版本。

  • 主要内容:实例,保存并执行代码,实例下面将创建一个名为 Customer 的 Ruby 类,声明两个方法: display_details:该方法用于显示客户的详细信息。 total_no_of_customers:该方法用于显示在系统中创建的客户总数量。 实例 #!/usr/bin/ruby class Customer @@no_of_customers=0 def initialize(id, name, addr) @cus