gpt4 book ai didi

scala - scala 中的构造函数(主/辅助/默认主)

转载 作者:行者123 更新时间:2023-12-04 01:33:59 28 4
gpt4 key购买 nike

Cay Horstmann 的书《不耐烦的 Scala》中的一个非常简单的练习一直让我感到困惑。是关于primary , auxiliarydefault primary构造函数:

ex 5.10 : Consider the class


class Employee(val name: String, var salary: Double) {
def this() { this("John Q. Public", 0.0) }
}

Rewrite it to use explicit fields and a default primary constructor.



我不确定我应该做什么。你们中的一些人可以提出解决方案吗?

然而,尝试解决这个练习可能让我意识到一些我之前没有注意到的关于主构造函数和 val 的事情。字段(如您所见,我不太确定):

如果我说 val,我说得对吗?字段(如上述 name 类中的 Employee)只能通过 primary 初始化构造函数而不是 auxiliary一 ?在后一种情况下,编译器会将其视为对 val 的重新分配。导致错误的字段。

起初我以为 val字段作为 java 中最终字段的粗略等效项,期望在任何构造函数中第一次分配它们是合法的,但似乎我错了。

我对这可能只是一个疯狂的猜测不太满意,所以如果有人能给我关于这一点的更准确的信息,我将不胜感激。

最佳答案

来自“Scala 编程,第 2 版”第 6.7 段:

In Scala, every auxiliary constructor must invoke another constructor of the same class as its first action. The net effect of this rule is that every constructor invocation in Scala will end up eventually calling the primary constructor of the class. The primary constructor is thus the single point of entry of a class.



所以 val初始化的所有数据必须在主构造函数中。

具有显式字段的类可能类似于:
class Employee(n: String = "John Q. Public", s: Double = 0.0) {
val name = n
var salary = s
}

或没有默认参数值:
class Employee(n: String, s: Double) {
def this() = this("John Q. Public", 0.0)
val name = n
var salary = s
}

关于scala - scala 中的构造函数(主/辅助/默认主),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426146/

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