案例类应用方法,这种语法是什么意思?

时间:2015-08-17 12:43:32

标签: scala intellij-idea playframework playframework-2.0

我正在尝试在侧面项目中使用Scala + Play 2.4.2,我正在编写一个json解析器,IntelliJ为我的语法建议了这个修复。

我无法理解这意味着什么

对我来说,这个(Person.apply, _)应该写成(Person.apply _),但就像我得到cannot resolve symbol apply并且代码无法编译。

因为我有一个重载的构造函数不应该(Person.apply _)使用valuereads函数中的参数调用它吗?

package models

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

case class Person(id: Long = 0, name: String, age: Int){
  def this(name: String, age: Int) = this(0, name, age)
}

object Person {

  implicit val personFormat = Json.format[Person]

  implicit val valuereads = (__ \ "value").read {(
  (__ \ "name").read[String] and
  (__ \ "age").read[Int]
   )(Person.apply, _)   //**<=== THIS, what apply, _ stands for**

  def apply(name: String, age: Int) = new Person(name, age)
}

固定语法仍然无法编译,但我没有收到任何警告。我在这里做错了什么?

BTW我正在关注此信息:https://www.playframework.com/documentation/2.4.x/ScalaJsonCombinators

1 个答案:

答案 0 :(得分:2)

你在这里遗漏了一些东西。对于初学者,虽然允许在案例类中使用备用构造函数,但通常认为最好避免在Scala中重载方法(请参阅此处的讨论Why "avoid method overloading"?)。如果您想提供“智能构造函数”,可以在Person伴随对象中放置一个,如下所示:

object Person {
  def makePerson(name: String, age: Int) = Person(name = name, age = age)
}

请注意,我没有使用new关键字,该关键字只能用于普通的class es。你也可以在伴侣对象中使用apply,但是在这里你会遇到歧义,Reads实例不确定你是指伴侣对象还是案例类本身。

另外,请注意,case类中的备用构造函数除了默认参数已经完成之外什么也没做。如果您只是将param的默认参数放在最后一个位置,如下所示:

case class Person(name: String, age: Int, id: Long = 0)

然后你可以做

Person("bob", 25) 

构造Person,0将用于id。