gpt4 book ai didi

scala - 如何在 case 类中指定多个构造函数?

转载 作者:行者123 更新时间:2023-12-04 21:51:33 25 4
gpt4 key购买 nike

我正在尝试创建一个具有多个构造函数的案例类:

object App {
def main(args: Array[String]) {
val a = Something("abc", 100500, _ % 2 == 0)
val b = Something(true, 10, 20)
println(s"$a - $b")
}
}

case class Something(s: String, n: Int, p: Int => Boolean) {
/*
Additional constructor -- Wrong way! -- it is imposible to invoke it outside the class
def this(b: Boolean, x: Int, y: Int) {
this("", 0, (i: Int) => i % x + y == 0)
}
*/
}

到目前为止,我的代码不起作用:
Error:(10, 23) type mismatch;
found : Boolean(true)
required: String
val b = Something(true, 10, 20)
^

为了修复它,我需要创建一个伴随对象来保存一个 apply 函数,该函数代表 Something 的新构造函数。类(class):
object Something {    
def apply(b: Boolean, x: Int, y: Int) = {
new Something(if (b) "" else "default", 0, _ => {
(x + y) % 2 == 0
})
}
}

这很不方便。也许还有其他方法可以将多个构造函数放入 case 类中?

最佳答案

实际上它有效,但你必须使用 new因为辅助构造函数没有 apply为案例类生成:

case class Something(s: String, n: Int, p: Int => Boolean) {
def this(b: Boolean, x: Int, y: Int) {
this("", 0, (i: Int) => i % x + y == 0)
}
}

new Something(true, 5, 5) // Works

如果你想要 Something(true, 5, 5)要工作,您需要像您说的那样创建伴随对象。我认为这是因为否则 case 类将无法像现在这样使用模式匹配,或者它会更加复杂。并注意模式匹配在这种情况下不起作用

还要记住 case 类支持默认构造函数,如 case class Something(s: String = "default")这可能会帮助你,但不幸的是它不能解决你的例子

关于scala - 如何在 case 类中指定多个构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463986/

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