Case class apply 方法,这个语法是什么意思?
Case class apply method, What does this syntax means?
我正在尝试在一个业余项目中使用 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)
}
固定语法仍然无法编译,但我没有收到任何警告。我在这里做错了什么?
顺便说一句,我正在关注此信息:https://www.playframework.com/documentation/2.4.x/ScalaJsonCombinators
你在这里遗漏了一些东西。对于初学者来说,虽然允许在 case class 中使用备用构造函数,但通常认为最好的做法是避免在 Scala 中重载方法(请参阅此处的讨论 Why "avoid method overloading"?)。如果你想提供一个 "smart constructor",你可以在 Person
伴随对象中放置一个,像这样:
object Person {
def makePerson(name: String, age: Int) = Person(name = name, age = age)
}
请注意,我没有使用 new
关键字,它只能用于普通的旧 class
es。您也可以像您所做的那样在伴随对象中使用 apply
,但是您会在这里遇到歧义,其中 Reads
实例不确定您是指伴随对象还是案件 class 本身。
此外,请注意,在 class 的情况下,您的备用构造函数实际上只做您的默认参数已经完成的工作。如果您只是将带有默认参数的参数放在最后一个位置,就像这样:
case class Person(name: String, age: Int, id: Long = 0)
那你就可以
Person("bob", 25)
构建一个Person
,id将使用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)
}
固定语法仍然无法编译,但我没有收到任何警告。我在这里做错了什么?
顺便说一句,我正在关注此信息:https://www.playframework.com/documentation/2.4.x/ScalaJsonCombinators
你在这里遗漏了一些东西。对于初学者来说,虽然允许在 case class 中使用备用构造函数,但通常认为最好的做法是避免在 Scala 中重载方法(请参阅此处的讨论 Why "avoid method overloading"?)。如果你想提供一个 "smart constructor",你可以在 Person
伴随对象中放置一个,像这样:
object Person {
def makePerson(name: String, age: Int) = Person(name = name, age = age)
}
请注意,我没有使用 new
关键字,它只能用于普通的旧 class
es。您也可以像您所做的那样在伴随对象中使用 apply
,但是您会在这里遇到歧义,其中 Reads
实例不确定您是指伴随对象还是案件 class 本身。
此外,请注意,在 class 的情况下,您的备用构造函数实际上只做您的默认参数已经完成的工作。如果您只是将带有默认参数的参数放在最后一个位置,就像这样:
case class Person(name: String, age: Int, id: Long = 0)
那你就可以
Person("bob", 25)
构建一个Person
,id将使用0。