我正在尝试在侧面项目中使用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
答案 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。