Scala Case类apply方法,这个语法是什么意思?
我试图在一个附带项目中使用Scala+Play2.4.2,我正在编写一个json解析器,IntelliJ建议对我的语法进行此修复 我不明白这是什么意思 对我来说,这个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
(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。使用案例类人物
免费为您提供伴生对象。如果定义对象人物
,是否会释放复制
、应用
等方法,因此需要重新定义它们(如果需要)?