gpt4 book ai didi

scala - 案例类别默认应用方法

转载 作者:行者123 更新时间:2023-12-04 13:22:31 27 4
gpt4 key购买 nike

假设我们有以下案例类:

case class CasePerson(firstName: String)

我们还为其定义了一个伴随对象:
object CasePerson {
def apply() = new CasePerson( "XYZ" )
}

注意,在上面的示例中,我使用 apply方法显式定义了一个伴随对象,而没有定义默认的apply方法:
// This "default" apply has the same argument as the primary constructor of the case class
def apply(firstName : String) = new CasePerson(firstName)

问:那么,Scala从何处获得此“默认值”呢?我在这里没有默认应用的情况下明确定义了伴随对象,编译器仍然知道如何执行此操作:
val casePerson = CasePerson("PQR")

这是如何运作的?

最佳答案

案例类隐式地伴随一个伴随对象,该对象带有一个apply(),该对象具有与案例类的主要构造函数相同的参数。

那是:

case class CasePerson(firstName: String)

将伴随
object CasePerson{
def apply(firstName: String) = new CasePerson(firstName)
}

现在,如果您还显式定义了一个伴随对象,则可以将其视为隐式定义的对象的附加对象。

例如,在您的示例中,您向伴随对象添加了一个新的 apply:
object CasePerson{
def apply() = new CasePerson("XYZ")
}

您可以将以下语句视为正在创建组合的伴随对象的语句:
object CasePerson{
def apply() = new CasePerson("XYZ") // the one manually added
def apply(firstName: String) = new CasePerson(firstName) // this one is automatically added
}

现在,如果您决定添加自己的 apply版本,该版本具有与主构造函数相同的参数,那么这将使case类的默认行为蒙上阴影。
object CasePerson{
def apply() = new CasePerson("XYZ")
def apply(s: String) = Seq(new CasePerson(s), new CasePerson(s)) // will replace the default factory for the case class
}

现在,如果您调用 CasePerson("hi"),它将生成:
List(CasePerson("hi"), CasePerson("hi"))

关于scala - 案例类别默认应用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34533539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com