Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 Case类apply方法,这个语法是什么意思?_Scala_Intellij Idea_Playframework_Playframework 2.0 - Fatal编程技术网

Scala Case类apply方法,这个语法是什么意思?

Scala Case类apply方法,这个语法是什么意思?,scala,intellij-idea,playframework,playframework-2.0,Scala,Intellij Idea,Playframework,Playframework 2.0,我试图在一个附带项目中使用Scala+Play2.4.2,我正在编写一个json解析器,IntelliJ建议对我的语法进行此修复 我不明白这是什么意思 对我来说,这个(Person.apply,)应该写(Person.apply),但是像这样,我得到了一个无法解析符号apply,并且代码没有编译 因为我有一个重载构造函数,所以不应该用valuereads函数中的参数调用它 package models import play.api.libs.json._ import play.api.li

我试图在一个附带项目中使用Scala+Play2.4.2,我正在编写一个json解析器,IntelliJ建议对我的语法进行此修复

我不明白这是什么意思

对我来说,这个
(Person.apply,)
应该写
(Person.apply)
,但是像这样,我得到了一个
无法解析符号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)
}
包模型
导入play.api.libs.json_
导入play.api.libs.functional.syntax_
案例类人物(id:Long=0,姓名:String,年龄:Int){
def this(name:String,age:Int)=this(0,name,age)
}
对象人{
隐式val personFormat=Json.format[Person]
隐式val valuereads=(“value”).read{(
(“name”)。读取[String]并
(“年龄”)。阅读[Int]

)(Person.apply,)/**此处缺少一些内容。对于初学者,虽然允许在case类中使用替代构造函数,但通常认为避免Scala中方法重载是最佳做法(请参阅此处的讨论)。如果您想提供“智能构造函数”,可以将一个放置在
Person
同伴对象中,如下所示:

object Person {
  def makePerson(name: String, age: Int) = Person(name = name, age = age)
}
请注意,我没有使用
new
关键字,该关键字只应用于普通的旧
es。您也可以像以前那样在同伴对象中使用
apply
,但是在这里您会遇到歧义,
读取
实例不确定您指的是同伴对象还是case类本身

另外,请注意,case类中的备用构造函数实际上只执行默认参数已经完成的操作。如果您只是将带有默认参数的参数放在最后一个位置,如下所示:

case class Person(name: String, age: Int, id: Long = 0)
那你就做吧

Person("bob", 25) 

若要构造
人物
,id将使用0。

使用
案例类人物
免费为您提供伴生对象。如果定义
对象人物
,是否会释放
复制
应用
等方法,因此需要重新定义它们(如果需要)?