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 关键字,它只能用于普通的旧 classes。您也可以像您所做的那样在伴随对象中使用 apply ,但是您会在这里遇到歧义,其中 Reads 实例不确定您是指伴随对象还是案件 class 本身。

此外,请注意,在 class 的情况下,您的备用构造函数实际上只做您的默认参数已经完成的工作。如果您只是将带有默认参数的参数放在最后一个位置,就像这样:

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

那你就可以

Person("bob", 25) 

构建一个Person,id将使用0。