gpt4 book ai didi

scala - 将参数添加到具有默认值的案例类

转载 作者:行者123 更新时间:2023-12-02 00:08:32 25 4
gpt4 key购买 nike

我有一个现有的案例类,我想向其添加一个额外的构造函数参数,具有默认值,并且不干扰进行模式匹配的现有代码,但我无法找到正确的方法。

即。我有:

case class Foo(a: Int, b: Int)

def bar(n: Foo) = n match {
case Foo(1, 2) => true
case _ => false
}

现在假设我需要向 Foo 添加一个附加参数 c。即。

case class Foo(a: Int, b: Int, c: Boolean = true)

在所有现有用例中,参数 c 为真,因此它具有默认值。然而在一些新的用例中,需要为此传递 false。

因此添加另一个参数似乎是明智的,默认值为 true。然而,一旦我这样做,bar 中的模式匹配就变成了语法错误。这似乎是错误的,因为我添加了默认的 = true 以确保不需要修改现有的构造函数调用。

我怎样才能做到这一点并保持旧模式匹配不变?

更新:请注意,我也不想重写 Foo 的所有现有实例。 @som-snytt 指出我可以添加另一个参数作为 Foo(a: Int, b: Int)(c: Boolean = true),这将是完美的,除了它会导致现有调用,例如作为 Foo(1,2) 失败(它们必须重写为 Foo(1,2)())。我正在寻找一种只为某些用例添加新参数的方法,并通过使用适用于其他任何地方的默认值来避免重写。

最佳答案

case Foo 语法不是调用构造函数,而是调用 object Foo 上的 unapply 方法。案例类自动生成各种样板,包括伴随对象和取消应用。

unapply 只有一个参数,被匹配的对象。这可以防止您重载它,因为您不能在 Java/Scala 中重载返回值。

所以简而言之,您不能完全按照自己的意愿行事。

但是,您可以创建一个具有不同名称的提取器。这是刚刚添加下划线的人: http://x3ro.de/multiple-unapply-methods-for-pattern-matching-in-scala/

不过,如果可能的话,为提取器变体使用更有意义的名称可能会更好。

以下是有关其工作原理的更多信息: http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html

您可以“手动”写出案例类所做的所有事情,并以不同的方式进行,例如不同的 unapply,但是如果您关心 equals、hashCode、toString 等所有这些,那将是非常烦人的。如果这样做,您也许可以避免必须更改现有代码,但这似乎不太值得。

这是某人发布的示例: https://gist.github.com/okapies/2814608

关于scala - 将参数添加到具有默认值的案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16869296/

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