gpt4 book ai didi

scala - 将模式匹配与混入一起使用时的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 03:18:35 25 4
gpt4 key购买 nike

我可能遗漏了一些明显的东西,但我做不到。

假设我们有以下代码:

object T {
def method: Unit = {
trait Mixin
case class Foo(foo: String)

val f = new Foo("hi") with Mixin
f match {
case Foo(s) => println(s)
}
}
}

这会在我调用 Test.method 时编译并打印“hi”。模式匹配代码甚至可以在嵌套方法或嵌套函数中,而且它可以工作。但是,如果我将案例类移到方法之外并直接附加到 T2:

object T2 {

case class Foo(foo: String)

def method: Unit = {
trait Mixin

val f = new Foo("hi") with Mixin
f match {
case Foo(s) => println(s)
}
}
}

它抛出以下错误:

Error:(183, 12) constructor cannot be instantiated to expected type;
found : T2.Foo
required: T2.Foo with Mixin
case Foo(s) => println(s)
^

如果现在我不使用 Mixin,只使用 val f = new Foo("hi"),它又可以正常工作了。如果我尝试匹配其类型,它也会起作用:

val f = new Foo("hi") with Mixin
f match {
case f: Foo => println("I am a Foo")
}

为什么 T2 不起作用,如果案例类(及其所有生成的方法)都在范围内,为什么定义它很重要?在我的真实代码中,我有几个案例类,在几个模块中,模式匹配器无处不在,所以我不能把所有东西都移动到同一个方法中,如果不需要的话我会更喜欢摆脱混入,那么我还有什么其他选择?

最佳答案

我相信有一些事情正在发生。

  • Scala 编译器正在尝试找出您要匹配的类型。
  • 您将顶级类型与本地类型混合在一起,这似乎会使编译器感到困惑。

T 中,FooMixin 都在您的方法范围内本地声明。局部类型在其作用域之外不一定可用(在本例中为 method)。因为一切都在同一范围内,所以编译器很容易弄清楚您要做什么。

T2 中,Foo 是在顶层声明的,但 Mixin 仍然是本地类型。这似乎摆脱了编译器。您可以通过将值 f 专门键入 Foo 来帮助编译器,这将允许您的代码段进行编译。

object T2 {
case class Foo(foo: String)
def method: Unit = {
trait Mixin
val f: Foo = new Foo("hi") with Mixin
f match {
case Foo(s) => println(s)
}
}
}

我希望我能给出更详细(并保证准确)的解释。

关于scala - 将模式匹配与混入一起使用时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952172/

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