Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 定义读取[X],其中X具有专用构造函数_Scala_Playframework 2.0 - Fatal编程技术网

Scala 定义读取[X],其中X具有专用构造函数

Scala 定义读取[X],其中X具有专用构造函数,scala,playframework-2.0,Scala,Playframework 2.0,给定具有“智能构造函数”的Person类,即只有Person#build中的“有效”值才会构造Person: case class Person private(age: Int) object Person { def build(age: Int): Option[Person] = if (age >= 0 && age <= 125) Some(Person(age)) else None } 有更好的办法吗?如果可能的话,我更愿意

给定具有“智能构造函数”的
Person
类,即只有
Person#build
中的“有效”值才会构造
Person

case class Person private(age: Int)

object Person {
  def build(age: Int): Option[Person] = 
    if (age >= 0 && age <= 125) Some(Person(age)) else None     
}

有更好的办法吗?如果可能的话,我更愿意避免例外情况。

如果您愿意放弃播放功能样式,您可以利用
JsResult
monad:

new Format[Person] {
  override def writes(o: Person): JsValue = ???

  override def reads(json: JsValue): JsResult[Person] = {
    try{
      json.as[JsObject].value.get("age")
        .flatMap(age => Person.build(age.as[Int])).map(JsSuccess(_))
        .getOrElse(JsError("wrong age"))
    } catch {
      case e: Exception =>
        JsError("wrong age")
    }
  }
}

val person = Json.toJson(Person.build(30))

val parsed: \/[String, Person] =  person.validate[Person].map(\/-(_)).getOrElse(-\/("some bad request"))

因此,它比我在评论中建议的要复杂一点,但基本上你可以将解析包装成一个方法,将
JsSuccess
转换为右侧,将
JsError
转换为左侧,
try/catch
我用来捕捉发送的json不是对象而是值的情况,或者年龄字段不是整数的情况。

为什么不使用case类Person(age:Int){require(age>=0&&age以避免异常,即使用Monads而不是exceptions如何定义伴生对象中的读取?@pedrofurla-我想我已经清楚地表明,我已经将
读取[Person]
添加到伴生对象中。而且,有一个相关的讨论-完全没有涉及它。
new Format[Person] {
  override def writes(o: Person): JsValue = ???

  override def reads(json: JsValue): JsResult[Person] = {
    try{
      json.as[JsObject].value.get("age")
        .flatMap(age => Person.build(age.as[Int])).map(JsSuccess(_))
        .getOrElse(JsError("wrong age"))
    } catch {
      case e: Exception =>
        JsError("wrong age")
    }
  }
}

val person = Json.toJson(Person.build(30))

val parsed: \/[String, Person] =  person.validate[Person].map(\/-(_)).getOrElse(-\/("some bad request"))